44 std::shared_ptr<const GPData>
_data;
45 std::unique_ptr<kernel::StationaryKernel<double, T>>
_kernel;
77 template <
typename RandomAccessIterator>
78 std::vector<T>
_calculate_covariance_vector(std::vector<T> input, RandomAccessIterator& internalVariables,
const bool fullSpace, std::vector<T>& constraints)
const;
93 template <
typename RandomAccessIterator>
94 T
_calculate_prediction(std::vector<T> covarianceVector, RandomAccessIterator& internalVariables,
const bool fullSpace, std::vector<T>& constraints)
const;
109 template <
typename RandomAccessIterator>
110 T
_calculate_variance(std::vector<T> covarianceVector, RandomAccessIterator& internalVariables,
const bool fullSpace, std::vector<T>& constraints)
const;
245 void get_full_space_variables_prediction(
unsigned int& variableNumber, std::vector<std::string>& variableNames, std::vector<std::pair<double, double>>& variableBounds)
const;
265 void get_full_space_variables_variance(
unsigned int& variableNumber, std::vector<std::string>& variableNames, std::vector<std::pair<double, double>>& variableBounds)
const;
334 _data = std::dynamic_pointer_cast<const GPData>(modelData);
335 if(_data ==
nullptr){
336 throw(
MelonException(
" Error while loading Gaussian process: Incorrect type of passed data object. The data object must be of type GPData."));
351 using namespace kernel;
354 switch(_data->matern) {
356 _kernel = std::make_unique<Matern12<double, T>>(_data->kernelData);
359 _kernel = std::make_unique<Matern32<double, T>>(_data->kernelData);
362 _kernel = std::make_unique<Matern52<double, T>>(_data->kernelData);
365 _kernel = std::make_unique<MaternInf<double, T>>(_data->kernelData);
368 throw(
MelonException(
" Encountered a fatal error while setting kernel: Unkown kernel."));
405 using std::min_element;
407 double minimum_scaled = *min_element(_data->Y.begin(), _data->Y.end());
409 double result = _parameterScaler->descale({ minimum_scaled }).front();
422 using std::max_element;
424 double maximum_scaled = *max_element(_data->Y.begin(), _data->Y.end());
426 double result = _parameterScaler->descale({maximum_scaled}).front();
440 std::vector<double> _Y;
441 for (
auto y : _data->Y) {
442 _Y.push_back(_parameterScaler->descale({ y }).front());
450 template <
typename T>
452 std::vector<T> dummyConstraints;
453 typename std::vector<T>::iterator dummyIterator;
456 throw MelonException(
" Error while calculating Gaussian process prediction: No model was loaded yet.");
459 std::vector<T> covarianceVector = _calculate_covariance_vector(input, dummyIterator,
false, dummyConstraints);
460 return _calculate_prediction(covarianceVector, dummyIterator,
false, dummyConstraints);
462 catch (
const std::exception& e) {
463 throw(
MelonException(
" Encountered a fatal error while calculating Gaussian process prediction. Terminating.", e));
466 throw(
MelonException(
" Encountered a fatal error while calculating Gaussian process prediction. Terminating."));
473 template <
typename T>
475 std::vector<T> dummyConstraints;
476 std::vector<T> dummInternalVariables;
477 typename std::vector<T>::iterator dummyIterator;
480 throw MelonException(
" Error while calculating Gaussian process variance: No model was loaded yet.");
483 std::vector<T> covarianceVector = _calculate_covariance_vector(input, dummyIterator,
false, dummyConstraints);
484 return _calculate_variance(covarianceVector, dummyIterator,
false, dummyConstraints);
486 catch (
const std::exception& e) {
487 throw(
MelonException(
" Encountered a fatal error while calculating Gaussian process variance. Terminating.", e));
490 throw(
MelonException(
" Encountered a fatal error while calculating Gaussian process variance. Terminating."));
498 template <
typename T>
502 throw MelonException(
" Error while calculating Gaussian process prediction: No model was loaded yet.");
505 auto internalVariablesIterator = internalVariables.begin();
506 std::vector<T> covarianceVector = _calculate_covariance_vector(input, internalVariablesIterator,
true, constraints);
507 return _calculate_prediction(covarianceVector, internalVariablesIterator,
true, constraints);
509 catch (
const std::exception& e) {
510 throw(
MelonException(
" Encountered a fatal error while calculating Gaussian process prediction. Terminating.", e));
513 throw(
MelonException(
" Encountered a fatal error while calculating Gaussian process prediction. Terminating."));
520 template <
typename T>
524 throw MelonException(
" Error while calculating Gaussian process variance: No model was loaded yet.");
527 auto internalVariablesIterator = internalVariables.begin();
528 std::vector<T> covarianceVector = _calculate_covariance_vector(input, internalVariablesIterator,
true, constraints);
529 return _calculate_variance(covarianceVector, internalVariablesIterator,
true, constraints);
531 catch (
const std::exception& e) {
532 throw(
MelonException(
" Encountered a fatal error while calculating Gaussian process variance. Terminating.", e));
535 throw(
MelonException(
" Encountered a fatal error while calculating Gaussian process variance. Terminating."));
542 template <
typename T>
546 throw MelonException(
" Error while calculating Gaussian process prediction and variance: No model was loaded yet.");
549 auto internalVariablesIterator = internalVariables.begin();
550 std::vector<T> covarianceVector = _calculate_covariance_vector(input, internalVariablesIterator,
true, constraints);
551 T prediction = _calculate_prediction(covarianceVector, internalVariablesIterator,
true, constraints);
552 T variance = _calculate_variance(covarianceVector, internalVariablesIterator,
true, constraints);
553 return std::make_pair(prediction, variance);
555 catch (
const std::exception& e) {
556 throw(
MelonException(
" Encountered a fatal error while calculating Gaussian process prediction and variance. Terminating.", e));
559 throw(
MelonException(
" Encountered a fatal error while calculating Gaussian process prediction and variance. Terminating."));
566 template <
typename T>
567 template <
typename RandomAccessIterator>
574 if (input.size() != _data->DX) {
575 throw MelonException(
" Error while calculating covariance vector: Incorrect input dimension. In reduced space mode evaluation the size of the variables vector must be equal to the input dimension of the gaussian process.");
582 std::vector<T> normalizedInput = _inputScaler->scale(input);
591 std::vector<T> covarianceVector(_data->nX, 0);
592 for (std::vector<int>::size_type h = 0; h != _data->nX; h++) {
593 T distance = _kernel->calculate_distance(_data->X[h], normalizedInput);
598 covarianceVector.at(h) = _kernel->evaluate_kernel(distance);
604 return covarianceVector;
610 template <
typename T>
611 template <
typename RandomAccessIterator>
615 std::vector<double> result_scaled;
616 std::vector<double> observationDeviations = _data->Y - _data->meanfunction;
617 result_scaled = _data->invK * observationDeviations;
618 T predictionDeviation =
dot_product(covarianceVector, result_scaled);
620 T result_scaled_t = predictionDeviation + _data->meanfunction;
626 T result = _predictionScaler->descale({ result_scaled_t }).front();
637 template <
typename T>
638 template <
typename RandomAccessIterator>
642 std::vector<T> ki_v = _data->invK * covarianceVector;
644 T normalizedResult = _data->K.at(0).at(0) - ki;
649 T result = normalizedResult * pow(_data->stdOfOutput, 2);
651 result = max(result, 1e-16);
661 template <
typename T>
667 unsigned int variableNumber;
668 std::vector<std::string> dummyVariableNames;
669 std::vector<std::pair<double, double>> dummyVariableBounds;
671 get_full_space_variables_prediction(variableNumber, dummyVariableNames, dummyVariableBounds);
673 return variableNumber;
679 template <
typename T>
685 const double MAX_BOUND = 10e6;
687 variableNames.clear();
688 variableBounds.clear();
690 variableNumber += _data->DX;
691 for (
size_t i = 0; i < _data->DX; i++) {
692 variableNames.push_back(
"normalized_input_" + std::to_string(i));
693 variableBounds.push_back(std::make_pair(-1, 1));
696 variableNumber += 2*_data->nX;
697 for (
size_t i = 0; i < _data->nX; i++) {
698 variableNames.push_back(
"squared_distance_" + std::to_string(i));
699 variableBounds.push_back(std::make_pair(0., MAX_BOUND));
701 variableNames.push_back(
"covariance_" + std::to_string(i));
702 variableBounds.push_back(std::make_pair(0., MAX_BOUND));
706 variableNames.push_back(
"normalized_prediction");
707 variableBounds.push_back(std::make_pair(-MAX_BOUND, MAX_BOUND));
710 variableNames.push_back(
"prediction");
711 variableBounds.push_back(std::make_pair(-MAX_BOUND, MAX_BOUND));
717 template <
typename T>
723 unsigned int variableNumber;
724 std::vector<std::string> dummyVariableNames;
725 std::vector<std::pair<double, double>> dummyVariableBounds;
727 get_full_space_variables_variance(variableNumber, dummyVariableNames, dummyVariableBounds);
729 return variableNumber;
735 template <
typename T>
741 const double MAX_BOUND = 10e6;
743 variableNames.clear();
744 variableBounds.clear();
746 variableNumber += _data->DX;
747 for (
size_t i = 0; i < _data->DX; i++) {
748 variableNames.push_back(
"normalized_input_" + std::to_string(i));
749 variableBounds.push_back(std::make_pair(-1, 1));
752 variableNumber += 2 * _data->nX;
753 for (
size_t i = 0; i < _data->nX; i++) {
754 variableNames.push_back(
"squared_distance_" + std::to_string(i));
755 variableBounds.push_back(std::make_pair(0., MAX_BOUND));
757 variableNames.push_back(
"covariance_" + std::to_string(i));
758 variableBounds.push_back(std::make_pair(0., MAX_BOUND));
762 variableNames.push_back(
"normalized_variance");
763 variableBounds.push_back(std::make_pair(0.0, MAX_BOUND));
766 variableNames.push_back(
"variance");
767 variableBounds.push_back(std::make_pair(1e-16, MAX_BOUND));
773 template <
typename T>
779 unsigned int variableNumber;
780 std::vector<std::string> dummyVariableNames;
781 std::vector<std::pair<double, double>> dummyVariableBounds;
783 get_full_space_variables_prediction_and_variance(variableNumber, dummyVariableNames, dummyVariableBounds);
785 return variableNumber;
791 template <
typename T>
796 const double MAX_BOUND = 10e6;
798 variableNames.clear();
799 variableBounds.clear();
801 variableNumber += _data->DX;
802 for (
size_t i = 0; i < _data->DX; i++) {
803 variableNames.push_back(
"normalized_input_" + std::to_string(i));
804 variableBounds.push_back(std::make_pair(-1, 1));
807 variableNumber += 2 * _data->nX;
808 for (
size_t i = 0; i < _data->nX; i++) {
809 variableNames.push_back(
"squared_distance_" + std::to_string(i));
810 variableBounds.push_back(std::make_pair(0., MAX_BOUND));
812 variableNames.push_back(
"covariance_" + std::to_string(i));
813 variableBounds.push_back(std::make_pair(0., MAX_BOUND));
817 variableNames.push_back(
"normalized_prediction");
818 variableBounds.push_back(std::make_pair(-MAX_BOUND, MAX_BOUND));
821 variableNames.push_back(
"prediction");
822 variableBounds.push_back(std::make_pair(-MAX_BOUND, MAX_BOUND));
825 variableNames.push_back(
"normalized_variance");
826 variableBounds.push_back(std::make_pair(0.0, MAX_BOUND));
829 variableNames.push_back(
"variance");
830 variableBounds.push_back(std::make_pair(1e-16, MAX_BOUND));
This class defines the exceptions thrown by FeedForwardNet.
Definition exceptions.h:32
This class represents a Gaussian process, to be used in the MAiNGO solver.
Definition gp.h:41
int get_input_dimension() const
Get the dimesnion of the input.
Definition gp.h:376
std::unique_ptr< Scaler< T > > _predictionScaler
Definition gp.h:47
void get_full_space_variables_prediction_and_variance(unsigned int &variableNumber, std::vector< std::string > &variableNames, std::vector< std::pair< double, double > > &variableBounds) const
Get the properties of internal variables used in the calculation of prediction and variance.
Definition gp.h:792
double get_minimum_of_training_data_outputs() const
Get the minimum value of the training data outputs.
Definition gp.h:400
const GPData & data() const
Getter for member variable _data.
Definition gp.h:304
void get_full_space_variables_prediction(unsigned int &variableNumber, std::vector< std::string > &variableNames, std::vector< std::pair< double, double > > &variableBounds) const
Get the properties of internal variables used in the calculation of the prediction.
Definition gp.h:680
std::unique_ptr< kernel::StationaryKernel< double, T > > _kernel
Definition gp.h:45
T _calculate_variance(std::vector< T > covarianceVector, RandomAccessIterator &internalVariables, const bool fullSpace, std::vector< T > &constraints) const
Calculates the variance of the Gaussian process for a given point.
Definition gp.h:639
double get_maximum_of_training_data_outputs() const
Get the maximum value of the training data outputs.
Definition gp.h:417
GaussianProcess()
Default Constructor.
Definition gp.h:117
const Scaler< T > & inputScaler() const
Getter for member variable _inputScaler.
Definition gp.h:314
const Scaler< T > & parameterScaler() const
Getter for member variable _parameterScaler.
Definition gp.h:324
void get_full_space_variables_variance(unsigned int &variableNumber, std::vector< std::string > &variableNames, std::vector< std::pair< double, double > > &variableBounds) const
Get the properties of internal variables used in the calculation of the variance.
Definition gp.h:736
unsigned int get_number_of_full_space_variables_prediction_and_variance() const
Get the number of internal variables used in the calculation of prediction and variance.
Definition gp.h:774
GaussianProcess(std::shared_ptr< const GPData > modelData)
Constructor.
Definition gp.h:140
T calculate_variance_reduced_space(std::vector< T > input) const
Calculates the variance of the Gaussian process at a given point in reduced space mode (only network ...
Definition gp.h:474
T _calculate_prediction(std::vector< T > covarianceVector, RandomAccessIterator &internalVariables, const bool fullSpace, std::vector< T > &constraints) const
Calculates the prediction of the Gaussian process for a given point.
Definition gp.h:612
std::shared_ptr< const GPData > _data
Definition gp.h:44
std::vector< double > get_normalized_observations() const
Returns the the normalized values of the observations based on which the Gaussian process was trained...
Definition gp.h:299
void _set_data_object(std::shared_ptr< const ModelData > modelData) override
Sets data object containing model parameters.
Definition gp.h:331
T calculate_variance_full_space(std::vector< T > input, std::vector< T > internalVariables, std::vector< T > &constraints) const
Calculates the variance of the Gaussian process at a given point in full space mode (values for all i...
Definition gp.h:521
int get_number_of_training_data_points() const
Get the number of training data points.
Definition gp.h:388
T calculate_prediction_reduced_space(std::vector< T > input) const
Calculates the prediction of the Gaussian process at a given point in reduced space mode (only networ...
Definition gp.h:451
T calculate_prediction_full_space(std::vector< T > input, std::vector< T > internalVariables, std::vector< T > &constraints) const
Calculates the prediction of the Gaussian process at a given point in full space mode (values for all...
Definition gp.h:499
unsigned int get_number_of_full_space_variables_variance() const
Get the number of internal variables used in the calculation of the variance.
Definition gp.h:718
std::vector< T > _calculate_covariance_vector(std::vector< T > input, RandomAccessIterator &internalVariables, const bool fullSpace, std::vector< T > &constraints) const
Calculates the covariance vector of the Gaussian process for a given point.
Definition gp.h:568
std::unique_ptr< Scaler< T > > _inputScaler
Definition gp.h:46
const kernel::StationaryKernel< double, T > & kernel() const
Getter for member variable _kernel.
Definition gp.h:309
std::vector< double > get_observations() const
Get the observations based on which the Gaussian process was trained and is evaluated.
Definition gp.h:435
std::unique_ptr< Scaler< double > > _parameterScaler
Definition gp.h:48
GaussianProcess(std::string modelPath, std::string modelName)
Constructor.
Definition gp.h:133
const Scaler< T > & predictionScaler() const
Getter for member variable _predictionScaler.
Definition gp.h:319
GaussianProcess(std::string modelName)
Constructor.
Definition gp.h:124
unsigned int get_number_of_full_space_variables_prediction() const
Get the number of internal variables used in the calculation of the prediction.
Definition gp.h:662
std::pair< T, T > calculate_prediction_and_variance_full_space(std::vector< T > input, std::vector< T > internalVariables, std::vector< T > &constraints) const
Calculates the prediction and the variance of the Gaussian process at a given point in full space mod...
Definition gp.h:543
void _set_kernel(std::shared_ptr< const GPData > data)
Function for setting the kernel of the Gaussian process.
Definition gp.h:350
This class is a factory class for creating child instances of GpParser.
Definition gpParser.h:50
void load_model(std::string modelName, MODEL_FILE_TYPE fileType)
Loads new model from file.
Definition MeLOn.h:114
void _set_constraints(std::vector< T > &constraints, std::vector< T > &constraintEvaluation, RandomAccessIterator &constraintValue) const
Sets constraints required for fullspace opimization.
Definition MeLOn.h:165
static std::unique_ptr< Scaler< T > > create_scaler(const std::shared_ptr< const ScalerData > scalerData)
Factory function for creating a instance of a scaler object.
Definition scaler.h:208
Abstract class defining scaling algorithm.
Definition scaler.h:65
@ JSON
Definition modelParser.h:33
auto dot_product(const std::vector< T > &v1, const std::vector< U > &v2)
Overloaded operator for vector class allowing the calulation of dot product of two vectors.
Definition vectorarithmetics.h:155
struct containing all information regarding the Gaussian process
Definition gpData.h:31