Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "base/SGObject.h"
00012 #include "lib/io.h"
00013 #include "base/Parallel.h"
00014 #include "base/init.h"
00015 #include "base/Version.h"
00016 #include "base/Parameter.h"
00017
00018 #include <stdlib.h>
00019 #include <stdio.h>
00020
00021
00022 namespace shogun
00023 {
00024 class CMath;
00025 class Parallel;
00026 class IO;
00027 class Version;
00028
00029 extern CMath* sg_math;
00030 extern Parallel* sg_parallel;
00031 extern IO* sg_io;
00032 extern Version* sg_version;
00033
00034 template<> void CSGObject::set_generic<bool>()
00035 {
00036 m_generic = PT_BOOL;
00037 }
00038
00039 template<> void CSGObject::set_generic<char>()
00040 {
00041 m_generic = PT_CHAR;
00042 }
00043
00044 template<> void CSGObject::set_generic<int8_t>()
00045 {
00046 m_generic = PT_INT8;
00047 }
00048
00049 template<> void CSGObject::set_generic<uint8_t>()
00050 {
00051 m_generic = PT_UINT8;
00052 }
00053
00054 template<> void CSGObject::set_generic<int16_t>()
00055 {
00056 m_generic = PT_INT16;
00057 }
00058
00059 template<> void CSGObject::set_generic<uint16_t>()
00060 {
00061 m_generic = PT_UINT16;
00062 }
00063
00064 template<> void CSGObject::set_generic<int32_t>()
00065 {
00066 m_generic = PT_INT32;
00067 }
00068
00069 template<> void CSGObject::set_generic<uint32_t>()
00070 {
00071 m_generic = PT_UINT32;
00072 }
00073
00074 template<> void CSGObject::set_generic<int64_t>()
00075 {
00076 m_generic = PT_INT64;
00077 }
00078
00079 template<> void CSGObject::set_generic<uint64_t>()
00080 {
00081 m_generic = PT_UINT64;
00082 }
00083
00084 template<> void CSGObject::set_generic<float32_t>()
00085 {
00086 m_generic = PT_FLOAT32;
00087 }
00088
00089 template<> void CSGObject::set_generic<float64_t>()
00090 {
00091 m_generic = PT_FLOAT64;
00092 }
00093
00094 template<> void CSGObject::set_generic<floatmax_t>()
00095 {
00096 m_generic = PT_FLOATMAX;
00097 }
00098
00099 }
00100
00101 using namespace shogun;
00102
00103 CSGObject::CSGObject()
00104 {
00105 init();
00106 set_global_objects();
00107 pthread_mutex_init(&m_ref_mutex, NULL);
00108
00109 SG_GCDEBUG("SGObject created (%p)\n", this);
00110 }
00111
00112 CSGObject::CSGObject(const CSGObject& orig)
00113 :io(orig.io), parallel(orig.parallel), version(orig.version)
00114 {
00115 init();
00116 set_global_objects();
00117 }
00118
00119 CSGObject::~CSGObject()
00120 {
00121 SG_GCDEBUG("SGObject destroyed (%p)\n", this);
00122
00123 pthread_mutex_destroy(&m_ref_mutex);
00124 unset_global_objects();
00125 delete m_parameters;
00126 }
00127
00128 void CSGObject::set_global_objects(void)
00129 {
00130 if (!sg_io || !sg_parallel || !sg_version)
00131 {
00132 fprintf(stderr, "call init_shogun() before using the library, dying.\n");
00133 exit(1);
00134 }
00135
00136 SG_REF(sg_io);
00137 SG_REF(sg_parallel);
00138 SG_REF(sg_version);
00139
00140 io=sg_io;
00141 parallel=sg_parallel;
00142 version=sg_version;
00143 }
00144
00145 void CSGObject::unset_global_objects(void)
00146 {
00147 SG_UNREF(version);
00148 SG_UNREF(parallel);
00149 SG_UNREF(io);
00150 }
00151
00152 void CSGObject::set_io(IO* new_io)
00153 {
00154 SG_UNREF(sg_io);
00155 sg_io=new_io;
00156 SG_REF(sg_io);
00157 }
00158
00159 IO* CSGObject::get_io()
00160 {
00161 SG_REF(sg_io);
00162 return sg_io;
00163 }
00164
00165 void CSGObject::set_parallel(Parallel* new_parallel)
00166 {
00167 SG_UNREF(sg_parallel);
00168 sg_parallel=new_parallel;
00169 SG_REF(sg_parallel);
00170 }
00171
00172 Parallel* CSGObject::get_parallel()
00173 {
00174 SG_REF(sg_parallel);
00175 return sg_parallel;
00176 }
00177
00178 void CSGObject::set_version(Version* new_version)
00179 {
00180 SG_UNREF(sg_version);
00181 sg_version=new_version;
00182 SG_REF(sg_version);
00183 }
00184
00185 Version* CSGObject::get_version()
00186 {
00187 SG_REF(sg_version);
00188 return sg_version;
00189 }
00190
00191 bool CSGObject::is_generic(EPrimitiveType* generic) const
00192 {
00193 *generic = m_generic;
00194
00195 return m_generic != PT_NOT_GENERIC;
00196 }
00197
00198 void CSGObject::unset_generic()
00199 {
00200 m_generic = PT_NOT_GENERIC;
00201 }
00202
00203 void CSGObject::print_serializable(const char* prefix)
00204 {
00205 SG_PRINT("\n%s\n================================================================================\n", get_name());
00206 m_parameters->print(prefix);
00207 }
00208
00209 bool CSGObject::save_serializable(CSerializableFile* file,
00210 const char* prefix)
00211 {
00212 SG_DEBUG("START SAVING CSGObject '%s'\n", get_name());
00213 try
00214 {
00215 save_serializable_pre();
00216 }
00217 catch (ShogunException e)
00218 {
00219 SG_SWARNING("%s%s::save_serializable_pre(): ShogunException: "
00220 "%s\n", prefix, get_name(),
00221 e.get_exception_string());
00222 return false;
00223 }
00224 if (!m_save_pre_called)
00225 {
00226 SG_SWARNING("%s%s::save_serializable_pre(): Implementation "
00227 "error: BASE_CLASS::LOAD_SERIALIZABLE_PRE() not "
00228 "called!\n", prefix, get_name());
00229 return false;
00230 }
00231
00232 if (!m_parameters->save(file, prefix))
00233 return false;
00234
00235 try
00236 {
00237 save_serializable_post();
00238 }
00239 catch (ShogunException e)
00240 {
00241 SG_SWARNING("%s%s::save_serializable_post(): ShogunException: "
00242 "%s\n", prefix, get_name(),
00243 e.get_exception_string());
00244 return false;
00245 }
00246
00247 if (!m_save_post_called)
00248 {
00249 SG_SWARNING("%s%s::save_serializable_post(): Implementation "
00250 "error: BASE_CLASS::LOAD_SERIALIZABLE_POST() not "
00251 "called!\n", prefix, get_name());
00252 return false;
00253 }
00254
00255 if (prefix == NULL || *prefix == '\0')
00256 file->close();
00257
00258 SG_DEBUG("DONE SAVING CSGObject '%s'\n", get_name());
00259
00260 return true;;
00261 }
00262
00263 bool CSGObject::load_serializable(CSerializableFile* file,
00264 const char* prefix)
00265 {
00266 SG_DEBUG("START LOADING CSGObject '%s'\n", get_name());
00267 try
00268 {
00269 load_serializable_pre();
00270 }
00271 catch (ShogunException e)
00272 {
00273 SG_SWARNING("%s%s::load_serializable_pre(): ShogunException: "
00274 "%s\n", prefix, get_name(),
00275 e.get_exception_string());
00276 return false;
00277 }
00278 if (!m_load_pre_called)
00279 {
00280 SG_SWARNING("%s%s::load_serializable_pre(): Implementation "
00281 "error: BASE_CLASS::LOAD_SERIALIZABLE_PRE() not "
00282 "called!\n", prefix, get_name());
00283 return false;
00284 }
00285
00286 if (!m_parameters->load(file, prefix))
00287 return false;
00288
00289 try
00290 {
00291 load_serializable_post();
00292 }
00293 catch (ShogunException e)
00294 {
00295 SG_SWARNING("%s%s::load_serializable_post(): ShogunException: "
00296 "%s\n", prefix, get_name(),
00297 e.get_exception_string());
00298 return false;
00299 }
00300
00301 if (!m_load_post_called)
00302 {
00303 SG_SWARNING("%s%s::load_serializable_post(): Implementation "
00304 "error: BASE_CLASS::LOAD_SERIALIZABLE_POST() not "
00305 "called!\n", prefix, get_name());
00306 return false;
00307 }
00308 SG_DEBUG("DONE LOADING CSGObject '%s'\n", get_name());
00309
00310 return true;
00311 }
00312
00313 void CSGObject::load_serializable_pre() throw (ShogunException)
00314 {
00315 m_load_pre_called = true;
00316 }
00317
00318 void CSGObject::load_serializable_post() throw (ShogunException)
00319 {
00320 m_load_post_called = true;
00321 }
00322
00323 void CSGObject::save_serializable_pre() throw (ShogunException)
00324 {
00325 m_save_pre_called = true;
00326 }
00327
00328 void CSGObject::save_serializable_post() throw (ShogunException)
00329 {
00330 m_save_post_called = true;
00331 }
00332
00333 void CSGObject::init()
00334 {
00335 m_refcount = 0;
00336 io = NULL;
00337 parallel = NULL;
00338 version = NULL;
00339 m_parameters = new Parameter();
00340 m_generic = PT_NOT_GENERIC;
00341 m_load_pre_called = false;
00342 m_load_post_called = false;
00343 }