/*************************************************************************** * GModelPar.cpp - Model parameter class * * ----------------------------------------------------------------------- * * copyright (C) 2009-2013 by Juergen Knoedlseder * * ----------------------------------------------------------------------- * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program. If not, see . * * * ***************************************************************************/ /** * @file GModelPar.cpp * @brief GModelPar class implementation. * @author Juergen Knoedlseder */ /* __ Includes ___________________________________________________________ */ #ifdef HAVE_CONFIG_H #include #endif #include "GException.hpp" #include "GModelPar.hpp" #include "GTools.hpp" /* __ Method name definitions ____________________________________________ */ #define G_CONSTRUCT "GModelPar::GModelPar(std::string&, double&, double&)" #define G_FACTOR_VALUE "GModelPar::factor_value(double&)" #define G_FACTOR_MIN "GModelPar::factor_min(double&)" #define G_FACTOR_MAX "GModelPar::factor_max(double&)" #define G_SCALE "GModelPar::scale(double&)" #define G_READ "GModelPar::read(GXmlElement&)" /* __ Macros _____________________________________________________________ */ /* __ Coding definitions _________________________________________________ */ /* __ Debug definitions __________________________________________________ */ /*========================================================================== = = = Constructors/destructors = = = ==========================================================================*/ /***********************************************************************//** * @brief Void constructor ***************************************************************************/ GModelPar::GModelPar(void) : GOptimizerPar() { // Initialise members init_members(); // Return return; } /***********************************************************************//** * @brief Parameter constructor * * @param[in] name Parameter name. * @param[in] value Parameter value. * * Constructs a parameter from a parameter @p name and a parameter @p value. * * The parameter is auto-scaled, which for a @p value that differs from zero * sets the scale factor to @p value and the @p factor_value to unity. For a * @p value of zero, the scale factor will be set to unity and the * @p factor_value will be set to @p value. ***************************************************************************/ GModelPar::GModelPar(const std::string& name, const double& value) : GOptimizerPar(name, value) { // Initialise members init_members(); // Return return; } /***********************************************************************//** * @brief Parameter constructor * * @param[in] name Parameter name. * @param[in] factor Parameter value factor. * @param[in] scale Parameter scaling (non-zero value). * * @exception GException::invalid_argument * Sacle factor of 0 specified. * * Constructs a parameter from a parameter @p name, value @p factor * and @p scale factor. The @p scale factor needs to be a non-zero value. * If the @p scale factor is zero, an exception is thrown. ***************************************************************************/ GModelPar::GModelPar(const std::string& name, const double& factor, const double& scale) : GOptimizerPar(name, factor, scale) { // Initialise members init_members(); // Return return; } /***********************************************************************//** * @brief Copy constructor * * @param[in] par Model parameter. ***************************************************************************/ GModelPar::GModelPar(const GModelPar& par) : GOptimizerPar(par) { // Initialise members init_members(); // Copy members copy_members(par); // Return return; } /***********************************************************************//** * @brief Destructor ***************************************************************************/ GModelPar::~GModelPar(void) { // Free members free_members(); // Return return; } /*========================================================================== = = = Operators = = = ==========================================================================*/ /***********************************************************************//** * @brief Assignment operator * * @param[in] par Model parameter. * @return Model parameter. ***************************************************************************/ GModelPar& GModelPar::operator=(const GModelPar& par) { // Execute only if object is not identical if (this != &par) { // Copy base class members this->GOptimizerPar::operator=(par); // Free members free_members(); // Initialise members init_members(); // Copy members copy_members(par); } // endif: object was not identical // Return this object return *this; } /*========================================================================== = = = Public methods = = = ==========================================================================*/ /***********************************************************************//** * @brief Clone model parameter * * @return Pointer to deep copy of model parameter. ***************************************************************************/ GModelPar* GModelPar::clone(void) const { // Clone model parameter return new GModelPar(*this); } /***********************************************************************//** * @brief Extract parameter attributes from XML element * * @param[in] xml XML element * * @exception GException::invalid_value * Invalid combination of parameter attributes encountered. * * Extracts the parameter attributes from an XML element of the form * * * * Each of the attributes are optional, with the following scheme for * assigning default values in case that the attribute was not found: * - @p value sets @p m_factor_value (defaults to 0.0) * - @p error sets @p m_factor_error (defaults to 0.0) * - @p scale sets @p m_scale (defaults to 1.0) * - @p min sets @p m_factor_min (will remove_min() if not found) * - @p max sets @p m_factor_max (will remove_max() if not found) * - @p free sets @p m_free (papameter will be fixed if not found) ***************************************************************************/ void GModelPar::read(const GXmlElement& xml) { // Get value std::string arg = xml.attribute("value"); if (arg != "") { m_factor_value = gammalib::todouble(arg); } else { m_factor_value = 0.0; } // Get error arg = xml.attribute("error"); if (arg != "") { m_factor_error = gammalib::todouble(arg); } else { m_factor_error = 0.0; } // Get scale factor arg = xml.attribute("scale"); if (arg != "") { m_scale = gammalib::todouble(arg); } else { m_scale = 1.0; } // Get min arg = xml.attribute("min"); if (arg != "") { m_factor_min = gammalib::todouble(arg); m_has_min = true; } else { remove_min(); } // Get max arg = xml.attribute("max"); if (arg != "") { m_factor_max = gammalib::todouble(arg); m_has_max = true; } else { remove_max(); } // Get free if (xml.attribute("free") == "1" || gammalib::tolower(xml.attribute("free")) == "true") { free(); } else { fix(); } // If there is a minimum and maximum, make sure that the maximum is // not smaller than the minimum if (m_has_min && m_has_max) { if (m_factor_min > m_factor_max) { std::string msg = "The model parameter \""+m_name+ "\" in the XML document has a minimum boundary "+ gammalib::str(m_factor_min)+ " that is larger than the maximum boundary "+ gammalib::str(m_factor_max)+".\n"+xml.print(); throw GException::invalid_value(G_READ, msg); } } // If there is a minimum, make sure that the value is not below it if (m_has_min && m_factor_value < m_factor_min) { std::string msg = "The model parameter \""+m_name+ "\" in the XML document has a value "+ gammalib::str(m_factor_value)+ " that is smaller than the minimum boundary "+ gammalib::str(m_factor_min)+".\n"+xml.print(); throw GException::invalid_value(G_READ, msg); } // If there is a maximum, make sure that the value is not above it if (m_has_max && m_factor_value > m_factor_max) { std::string msg = "The model parameter \""+m_name+ "\" in the XML document has a value "+ gammalib::str(m_factor_value)+ " that is larger than the maximum boundary "+ gammalib::str(m_factor_max)+".\n"+xml.print(); throw GException::invalid_value(G_READ, msg); } // Return return; } /***********************************************************************//** * @brief Set or update parameter attributes in XML element * * @param[in] xml XML element. * * Sets or updates the parameter attributes in an XML element of the form * * * * The following attributes will be set: * - @p value * - @p error (only in case that the parameter is free) * - @p scale * - @p min (only in case that a minimum exists) * - @p max (only in case that a maximum exists) * - @p free ***************************************************************************/ void GModelPar::write(GXmlElement& xml) const { // Set value xml.attribute("value", gammalib::str(m_factor_value)); // Set error (only if parameter is free) if (is_free()) { xml.attribute("error", gammalib::str(m_factor_error)); } // Set scale xml.attribute("scale", gammalib::str(m_scale)); // Set minimum if (has_min()) { xml.attribute("min", gammalib::str(m_factor_min)); } // Set maximum if (has_max()) { xml.attribute("max", gammalib::str(m_factor_max)); } // Set free/fix flag if (is_free()) { xml.attribute("free", "1"); } else { xml.attribute("free", "0"); } // Return return; } /*========================================================================== = = = Private methods = = = ==========================================================================*/ /***********************************************************************//** * @brief Initialise class members ***************************************************************************/ void GModelPar::init_members(void) { // Return return; } /***********************************************************************//** * @brief Copy class members * * @param[in] par Model parameter. ***************************************************************************/ void GModelPar::copy_members(const GModelPar& par) { // Return return; } /***********************************************************************//** * @brief Delete class members ***************************************************************************/ void GModelPar::free_members(void) { // Return return; }