From 99e083fc62502f3be6bc03fcd04a332535c9cb27 Mon Sep 17 00:00:00 2001 From: Sergey Lisitsyn Date: Mon, 1 Jan 2018 15:26:39 +0400 Subject: [PATCH] Use separate methods for creating and updating parameters (#4062) --- src/shogun/base/AnyParameter.h | 5 +++++ src/shogun/base/SGObject.cpp | 26 +++++++++++++++++++++++--- src/shogun/base/SGObject.h | 22 ++++++++++++++-------- 3 files changed, 42 insertions(+), 11 deletions(-) diff --git a/src/shogun/base/AnyParameter.h b/src/shogun/base/AnyParameter.h index 4285a6caaf3..e363bd70240 100644 --- a/src/shogun/base/AnyParameter.h +++ b/src/shogun/base/AnyParameter.h @@ -78,6 +78,11 @@ namespace shogun return m_value; } + void set_value(const Any& value) + { + m_value = value; + } + AnyParameterProperties get_properties() const { return m_properties; diff --git a/src/shogun/base/SGObject.cpp b/src/shogun/base/SGObject.cpp index 01c79df014d..8418c2f508b 100644 --- a/src/shogun/base/SGObject.cpp +++ b/src/shogun/base/SGObject.cpp @@ -45,11 +45,26 @@ namespace shogun class CSGObject::Self { public: - void put(const BaseTag& tag, const AnyParameter& parameter) + void create(const BaseTag& tag, const AnyParameter& parameter) { + if (has(tag)) + { + SG_SERROR("Can not register %s twice", tag.name().c_str()) + } map[tag] = parameter; } + void update(const BaseTag& tag, const Any& value) + { + if (!has(tag)) + { + SG_SERROR( + "Can not update unregistered parameter %s", + tag.name().c_str()) + } + map.at(tag).set_value(value); + } + AnyParameter get(const BaseTag& tag) const { if(!has(tag)) @@ -788,10 +803,15 @@ bool CSGObject::clone_parameters(CSGObject* other) return true; } -void CSGObject::put_parameter( +void CSGObject::create_parameter( const BaseTag& _tag, const AnyParameter& parameter) { - self->put(_tag, parameter); + self->create(_tag, parameter); +} + +void CSGObject::update_parameter(const BaseTag& _tag, const Any& value) +{ + self->update(_tag, value); } AnyParameter CSGObject::get_parameter(const BaseTag& _tag) const diff --git a/src/shogun/base/SGObject.h b/src/shogun/base/SGObject.h index 7c40c65258e..b6bc550137d 100644 --- a/src/shogun/base/SGObject.h +++ b/src/shogun/base/SGObject.h @@ -340,7 +340,7 @@ class CSGObject if (has_parameter(_tag)) { if(has(_tag.name())) - put_parameter(_tag, AnyParameter(erase_type(value))); + update_parameter(_tag, erase_type(value)); else { SG_ERROR("Type for parameter with name \"%s\" is not correct.\n", @@ -468,7 +468,7 @@ class CSGObject template void register_param(Tag& _tag, const T& value) { - put_parameter(_tag, AnyParameter(erase_type(value))); + create_parameter(_tag, AnyParameter(erase_type(value))); } /** Registers a class parameter which is identified by a name. @@ -483,7 +483,7 @@ class CSGObject void register_param(const std::string& name, const T& value) { BaseTag tag(name); - put_parameter(tag, AnyParameter(erase_type(value))); + create_parameter(tag, AnyParameter(erase_type(value))); } template @@ -491,7 +491,7 @@ class CSGObject const std::string& name, T* value, AnyParameterProperties properties) { BaseTag tag(name); - put_parameter( + create_parameter( tag, AnyParameter(erase_type_non_owning(value), properties)); } @@ -552,13 +552,19 @@ class CSGObject */ bool has_parameter(const BaseTag& _tag) const; - /** Registers and modifies a class parameter, identified by a BaseTag. - * Throws an exception if the class does not have such a parameter. + /** Creates a parameter identified by a BaseTag. + * + * @param _tag name information of parameter + * @param parameter parameter to be created + */ + void create_parameter(const BaseTag& _tag, const AnyParameter& parameter); + + /** Updates a parameter identified by a BaseTag. * * @param _tag name information of parameter - * @param any value without type information of the parameter + * @param value new value of parameter */ - void put_parameter(const BaseTag& _tag, const AnyParameter& any); + void update_parameter(const BaseTag& _tag, const Any& value); /** Getter for a class parameter, identified by a BaseTag. * Throws an exception if the class does not have such a parameter.