00001 #ifndef __RECIPIE_H__
00002 #define __RECIPIE_H__
00003
00004 #undef DEBUG
00005 #define DEBUG 0
00006 #include "libDebug.h"
00007
00008
00009
00010 template<class SOURCE>
00011 class RecipieOf: public Counted
00012 {
00013 typedef typename SOURCE::type_point POINT;
00014 typedef typename SOURCE::type_data DATA;
00015 typedef typename SOURCE::type_precision PRECISION;
00016 public:
00017 typedef typename SOURCE::type_point type_point;
00018 typedef typename SOURCE::type_data type_data;
00019 static const int type_dimensionality = SOURCE::type_dimensionality;
00020 typedef typename SOURCE::type_precision type_precision;
00021 typedef SOURCE type_source;
00022
00023 private:
00024 int m_csrc;
00025 SOURCE* m_vsrcFinal;
00026
00027 protected:
00028
00029 RecipieOf() :
00030 Counted(), m_csrc(0), m_vsrcFinal(NULL)
00031 {
00032 }
00033
00034 void SetSource(int c, SOURCE* vsrc)
00035 {
00036 m_csrc = c;
00037 m_vsrcFinal = vsrc;
00038 }
00039
00040 public:
00041
00042 virtual void RegisterParameters(RegistryOfParameters& regParam) =0;
00043
00044 virtual void RegisterInitialSteps(RegistryOfInitialSteps& regSteps) =0;
00045
00046 virtual void Normalize() =0;
00047
00048 public:
00049 virtual ~RecipieOf() __attribute__((always_inline))
00050 {
00051 }
00052
00053
00054 virtual const POINT& Size() const
00055 {
00056 return m_vsrcFinal[0].Size();
00057 }
00058
00059 virtual PRECISION CSize() const
00060 {
00061 return m_vsrcFinal[0].CSize();
00062 }
00063
00064 virtual void GetPoint(DATA* vdataOut, const POINT& pt) const
00065 {
00066 for (int n = 0; n < m_csrc; n++)
00067 {
00068 ::GetPoint(m_vsrcFinal[n], vdataOut[n], pt);
00069 }
00070 }
00071
00072 virtual void PrepareForAccess() const
00073 {
00074 for (int n = 0; n < m_csrc; n++)
00075 {
00076 m_vsrcFinal[n].PrepareForAccess();
00077 }
00078 }
00079
00080 virtual void PrepareForAccess(int n) const
00081 {
00082 m_vsrcFinal[n].PrepareForAccess();
00083 }
00084
00085 virtual String Describe() const
00086 {
00087 String s;
00088 for (int n = 0; n < m_csrc; n++)
00089 {
00090 s = s + (_LINE + "Source " + n + LINE_ + (_INDENT
00091 + m_vsrcFinal[n].Describe()));
00092 }
00093
00094 return (_LINE + "Recipie with " + m_csrc + LINE_ + s);
00095 }
00096
00097 virtual int CSources() const
00098 {
00099 return m_csrc;
00100 }
00101
00102 virtual SOURCE* PSource(int n)
00103 {
00104 return &m_vsrcFinal[n];
00105 }
00106
00107 virtual SOURCE* VSources()
00108 {
00109 return m_vsrcFinal;
00110 }
00111
00112 template<class SOURCE_OUT>
00113 void AllocatedCopies(SOURCE_OUT* viOut)
00114 {
00115 int c = this->CSources();
00116 for (int n = 0; n < c; n++)
00117 {
00118 ::AllocatedCopy(viOut[n], m_vsrcFinal[n]);
00119 }
00120 }
00121
00122 static String SerializationId()
00123 {
00124 return "Recipie";
00125 }
00126
00127 void Serialize(Stream& st) const
00128 {
00129 for (int n = 0; n < m_csrc; n++)
00130 {
00131 ::Serialize(st, m_vsrcFinal[n]);
00132 }
00133 }
00134
00135 void Deserialize(Stream &st)
00136 {
00137 for (int n = 0; n < m_csrc; n++)
00138 {
00139 ::Deserialize(st, m_vsrcFinal[n]);
00140 }
00141 }
00142
00143 };
00144
00145
00146
00147
00148
00149
00150 #define _RECIPIE_TYPES(_name,_class,_data,_dims,_precision,_source) \
00151 typedef _class<_data,_dims,_precision,LAYER_##_source> LAYER_##_name;
00152
00153 #define _RECIPIE_STORAGE_TYPE(_name,_class,_data,_dims,_precision,_source) \
00154 PRIVATE::LAYER_##_name
00155
00156
00157
00158 #define _RECIPIE_STORAGE(_name,_class,_data,_dims,_precision,_source) \
00159 PRIVATE::LAYER_##_name* m_vsrc##_name; \
00160 bool m_bOptimize##_name;
00161
00162 #define _RECIPIE_ACCESSOR(_name,_class,_data,_dims,_precision,_source) \
00163 PRIVATE::LAYER_##_name& Layer##_name(int n){ return m_vsrc##_name[n]; } \
00164 void OptimizeLayer##_name(bool b){ m_bOptimize##_name=b; }
00165
00166 #define _RECIPIE_OPTIMIZELAYERDEFAULT(_name,_class,_data,_dims,_precision,_source) \
00167 m_bOptimize##_name=true;
00168
00169 #define _RECIPIE_ALLOCATELAYER(_name,_class,_data,_dims,_precision,_source) \
00170 m_vsrc##_name = new PRIVATE::LAYER_##_name[c];
00171
00172 #define _RECIPIE_DELETELAYER(_name,_class,_data,_dims,_precision,_source) \
00173 for (int n=CSources()-1; n>=0; n--){ \
00174 m_vsrc##_name[n].WipeSource(); \
00175 } \
00176 delete [] m_vsrc##_name;
00177
00178 #define _RECIPIE_SETSOURCE(_name,_class,_data,_dims,_precision,_source) \
00179 m_vsrc##_name[n].SetSource(&m_vsrc##_source[n]);
00180
00181 #define _RECIPIE_SETLASTSOURCE(_name,_class,_data,_dims,_precision,_source) \
00182 this->SetSource(c,m_vsrc##_name);
00183
00184 #define _RECIPIE_REGISTER_PARAMS(_name,_class,_data,_dims,_precision,_source) \
00185 if (m_bOptimize##_name){ \
00186 Layer##_name(n).RegisterParameters(regParam); \
00187 }
00188
00189 #define _RECIPIE_REGISTER_INITIALSTEPS(_name,_class,_data,_dims,_precision,_source) \
00190 if (m_bOptimize##_name){ \
00191 ::RegisterInitialSteps(Layer##_name(n), regSteps); \
00192 }
00193
00194 #define _RECIPIE_NORMALIZE(_name,_class,_data,_dims,_precision,_source) \
00195 if (m_bOptimize##_name){ \
00196 NormalizeGroup(this->CSources(),m_vsrc##_name); \
00197 }
00198
00199 #define _RECIPIE_COUNT(_name,_class,_data,_dims,_precision,_source) \
00200 +1
00201
00202 #define _RECIPIE_DESCRIBE(_name,_class,_data,_dims,_precision,_source) \
00203 Layer##_name(n).Describe();
00204
00205 #define CONCAT2(x,y) x ## y
00206 #define CONCAT(x,y) CONCAT2(x,y)
00207
00208 #define PRIVATE CONCAT(_privateNS,__LINE__)
00209
00210
00211
00212
00213 #define MAKE_RECIPIE( \
00214 _recipie, \
00215 _source, \
00216 _do_mid_layers, \
00217 _do_last_layer \
00218 ) \
00219 namespace PRIVATE { \
00220 typedef _source LAYER_INPUT; \
00221 _do_mid_layers(_RECIPIE_TYPES); \
00222 _do_last_layer(_RECIPIE_TYPES); \
00223 } \
00224 \
00225 class _recipie \
00226 : public RecipieOf<_do_last_layer(_RECIPIE_STORAGE_TYPE)> \
00227 { \
00228 protected: \
00229 \
00230 PRIVATE::LAYER_INPUT* m_vsrcINPUT; \
00231 _do_mid_layers(_RECIPIE_STORAGE); \
00232 _do_last_layer(_RECIPIE_STORAGE); \
00233 \
00234 public: \
00235 _recipie(int c, _source* vsrcInput) \
00236 : RecipieOf<_do_last_layer(_RECIPIE_STORAGE_TYPE)>() \
00237 { \
00238 m_vsrcINPUT=vsrcInput; \
00239 _do_mid_layers(_RECIPIE_ALLOCATELAYER); \
00240 _do_last_layer(_RECIPIE_ALLOCATELAYER); \
00241 \
00242 _do_mid_layers(_RECIPIE_OPTIMIZELAYERDEFAULT); \
00243 _do_last_layer(_RECIPIE_OPTIMIZELAYERDEFAULT); \
00244 \
00245 for (int n=0; n<c; n++){ \
00246 _do_mid_layers(_RECIPIE_SETSOURCE); \
00247 _do_last_layer(_RECIPIE_SETSOURCE); \
00248 } \
00249 \
00250 _do_last_layer(_RECIPIE_SETLASTSOURCE); \
00251 } \
00252 \
00253 ~_recipie() \
00254 { \
00255 if (AboutToDie()){ \
00256 _do_mid_layers(_RECIPIE_DELETELAYER); \
00257 _do_last_layer(_RECIPIE_DELETELAYER); \
00258 } \
00259 } \
00260 \
00261 int CLayers() const \
00262 { \
00263 return ( \
00264 _do_mid_layers(_RECIPIE_COUNT) \
00265 _do_last_layer(_RECIPIE_COUNT) \
00266 ); \
00267 } \
00268 \
00269 virtual String Describe() const \
00270 { \
00271 return ( \
00272 _LINE + #_recipie + LINE_ + \
00273 ( \
00274 _INDENT + \
00275 RecipieOf<_do_last_layer(_RECIPIE_STORAGE_TYPE)>::Describe() \
00276 ) \
00277 ); \
00278 } \
00279 \
00280 void RegisterParameters( \
00281 RegistryOfParameters& regParam \
00282 ) \
00283 { \
00284 int c=this->CSources(); \
00285 for (int n=0; n<c; n++){ \
00286 RegisterParameters(n,regParam); \
00287 } \
00288 } \
00289 \
00290 void RegisterParameters( \
00291 int n, \
00292 RegistryOfParameters& regParam \
00293 ) \
00294 { \
00295 _do_mid_layers(_RECIPIE_REGISTER_PARAMS); \
00296 _do_last_layer(_RECIPIE_REGISTER_PARAMS); \
00297 } \
00298 \
00299 void RegisterInitialSteps( \
00300 RegistryOfInitialSteps& regSteps \
00301 ) \
00302 { \
00303 int c=this->CSources(); \
00304 \
00305 for (int n=0; n<c; n++){ \
00306 RegisterInitialSteps(n,regSteps); \
00307 } \
00308 } \
00309 \
00310 void RegisterInitialSteps( \
00311 int n, \
00312 RegistryOfInitialSteps& regSteps \
00313 ) \
00314 { \
00315 _do_mid_layers(_RECIPIE_REGISTER_INITIALSTEPS); \
00316 _do_last_layer(_RECIPIE_REGISTER_INITIALSTEPS); \
00317 } \
00318 \
00319 PRIVATE::LAYER_INPUT* LayerINPUT(){ return m_vsrcINPUT; } \
00320 _do_mid_layers(_RECIPIE_ACCESSOR); \
00321 _do_last_layer(_RECIPIE_ACCESSOR); \
00322 \
00323 void Normalize() \
00324 { \
00325 _do_mid_layers(_RECIPIE_NORMALIZE); \
00326 _do_last_layer(_RECIPIE_NORMALIZE); \
00327 } \
00328 };
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354 #endif //#ifndef __RECIPIE_H__