diff --git a/src/shogun/base/SGObject.cpp b/src/shogun/base/SGObject.cpp index 2dec53ac746..350ea8c26aa 100644 --- a/src/shogun/base/SGObject.cpp +++ b/src/shogun/base/SGObject.cpp @@ -150,7 +150,10 @@ namespace shogun using namespace shogun; -CSGObject::CSGObject() : self() +CSGObject::CSGObject() + : self(), m_subject_params(), + m_observable_params(m_subject_params.get_observable()), + m_subscriber_params(m_subject_params.get_subscriber()) { init(); set_global_objects(); @@ -160,7 +163,10 @@ CSGObject::CSGObject() : self() } CSGObject::CSGObject(const CSGObject& orig) -: self(), io(orig.io), parallel(orig.parallel), version(orig.version) + : self(), io(orig.io), parallel(orig.parallel), version(orig.version), + m_subject_params(orig.m_subject_params), + m_observable_params(orig.m_observable_params), + m_subscriber_params(orig.m_subscriber_params) { init(); set_global_objects(); @@ -753,7 +759,7 @@ bool CSGObject::clone_parameters(CSGObject* other) { REQUIRE(other, "Provided instance must be non-empty.\n"); index_t num_parameters = m_parameters->get_num_parameters(); - + REQUIRE(other->m_parameters->get_num_parameters() == num_parameters, "Number of parameters of provided instance (%d) must match this instance (%d).\n", other->m_parameters->get_num_parameters(), num_parameters); @@ -800,3 +806,8 @@ bool CSGObject::type_erased_has(const BaseTag& _tag) const { return self->has(_tag); } + +void CSGObject::observe_scalar(const std::string& name, const Any& value) +{ + m_subscriber_params.on_next(std::make_pair(name, value)); +} diff --git a/src/shogun/base/SGObject.h b/src/shogun/base/SGObject.h index 6a95453b524..4124901a38a 100644 --- a/src/shogun/base/SGObject.h +++ b/src/shogun/base/SGObject.h @@ -23,6 +23,9 @@ #include #include +#include +#include + /** \namespace shogun * @brief all of classes and functions are contained in the shogun namespace */ @@ -394,6 +397,22 @@ class CSGObject return get(tag); } +#ifndef SWIG + /** + * Get parameters observable + * @return RxCpp observable + */ + rxcpp::observable> get_parameters_observable() + { + return m_observable_params; + }; +#endif + + /** Subscribe a parameter observer to watch over params */ + void subscribe_to_parameters() + { + } + protected: /** Can (optionally) be overridden to pre-initialize some member * variables which are not PARAMETER::ADD'ed. Make sure that at @@ -545,6 +564,12 @@ class CSGObject class Self; Unique self; +protected: + /** Observe the parameter and emits a value using the + * observable object + */ + void observe_scalar(const std::string& name, const Any& value); + public: /** io */ SGIO* io; @@ -576,6 +601,15 @@ class CSGObject bool m_save_post_called; RefCount* m_refcount; + + /** Subject used to create the params observer */ + rxcpp::subjects::subject> m_subject_params; + + /** Parameter Observable */ + rxcpp::observable> m_observable_params; + + /** Subscriber used to call onNext, onComplete etc.*/ + rxcpp::subscriber> m_subscriber_params; }; } #endif // __SGOBJECT_H__