file src/model_validation.cpp
[No description available] More…
Namespaces
| Name |
|---|
| Gambit TODO: see if we can use this one: |
Detailed Description
Author: Patrick Stoecker (stoecker@physik.rwth-aachen.de)
Date: 2026 Oct
Definitions for model validation classes
Authors (add name and date if you modify):
Source code
// *********************************************
// GAMBIT: Global and Modular BSM Inference Tool
// *********************************************
/// \file
///
/// Definitions for model validation classes
///
/// *********************************************
///
/// Authors (add name and date if you modify):
///
/// \author Patrick Stoecker
/// (stoecker@physik.rwth-aachen.de)
/// \date 2026 Oct
///
/// *********************************************
#include <iostream>
#include <sstream>
#include "gambit/Utils/model_validation.hpp"
#include "gambit/Utils/model_parameters.hpp"
#include "gambit/Utils/standalone_error_handlers.hpp"
namespace Gambit
{
ModelValidationHandler& ModelValidationHandler::getInstance()
{
static ModelValidationHandler instance;
return instance;
}
void ModelValidationHandler::setModelValidationHandling(const ModelValidationHandling &h)
{
_model_validation_handling = h;
}
const ModelValidationHandling &ModelValidationHandler::getModelValidationHandling() const
{
return _model_validation_handling;
}
void ModelValidationHandler::activate()
{
_model_validation_active = true;
}
void ModelValidationHandler::deactivate()
{
_model_validation_active = false;
}
void ModelValidationHandler::registerModelValidator(const std::string& model_name, modelValidator f)
{
if (_model_validators.find(model_name) != _model_validators.end())
{
model_error().raise(LOCAL_INFO, "Attempt to register model validation function for model " + model_name + " failed. A model validation function has already been registered.");
}
_model_validators[model_name] = std::move(f);
}
bool ModelValidationHandler::hasModelValidator(const std::string& model_name) const
{
return _model_validators.find(model_name) != _model_validators.end();
}
bool ModelValidationHandler::validateModel(const ModelParameters& model_parameters) const
{
auto it = _model_validators.find(model_parameters.getModelName());
if (it == _model_validators.end() || !it->second)
{
return true;
}
return it->second(model_parameters);
}
void ModelValidationHandler::runModelValidation(const ModelParameters &model_parameters) const
{
// Model validation short circuits, if:
// - model validation is not activated
// - model validation handling is 'pass'
// - model parameters are valid
if (!_model_validation_active || _model_validation_handling == ModelValidationHandling::pass || validateModel(model_parameters))
{
return;
}
// If this point is reached, model validation is active, model parameters are invalid and the model validation handling is not pass.
std::stringstream ss;
ss << "Parameters of model " << model_parameters.getModelName() << " are invalid.";
if (_model_validation_handling == ModelValidationHandling::invalidate)
{
invalid_point().raise(ss.str());
}
else if (_model_validation_handling == ModelValidationHandling::raise)
{
model_error().raise(LOCAL_INFO, ss.str());
}
else
{
// This should be unreachable
utils_error().raise(LOCAL_INFO, "Reached unreachable code in ModelValidationHandler::runModelValidation. This is a bug.");
}
}
int register_model_validation_function(const std::string& model, modelValidator f)
{
try
{
ModelValidationHandler::getInstance().registerModelValidator(model, std::move(f));
}
catch (std::exception& e)
{
std::cout << "Error registering model validation function for model " << model << ": " << e.what() << std::endl;
throw(e);
}
return 0;
}
} // namespace Gambit
Updated on 2026-11-03 at 14:50:45 +0000