SimStructure.H
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef MODELNEURON_SIMSTRUCTURE_H_DEFINED
00039 #define MODELNEURON_SIMSTRUCTURE_H_DEFINED
00040
00041 #include "Util/SimTime.H"
00042 #include "Image/Image.H"
00043 #include "ModelNeuron/Location.H"
00044 #include "GenericUtils/GenericFactory.H"
00045 #include "GenericUtils/CreateFunctor.H"
00046 #include "Image/LowPassLpt.H"
00047
00048 #include <typeinfo>
00049
00050 class SimUnit;
00051
00052
00053
00054
00055
00056
00057
00058 class SimStructure
00059 {
00060 public:
00061
00062 typedef CreateFunctor<SimStructure, ParamList<BorderPolicy, SimTime, uint, uint> > Creator;
00063 typedef GenericFactory<SimStructure, std::string, Creator> Factory;
00064
00065
00066 SimStructure(const uint width, const uint height, const std::string name = "", const std::string units = "");
00067
00068
00069 virtual ~SimStructure() { };
00070
00071
00072
00073
00074
00075
00076 virtual void input(const Image<double>& in, const int pos = -1) = 0;
00077
00078
00079 virtual void inputExc(const Image<double>& in, const int pos = -1) = 0;
00080
00081
00082 virtual void inputInh(const Image<double>& in, const int pos = -1) = 0;
00083
00084
00085 virtual Image<double> getOutput(const int pos = -1) const = 0;
00086
00087
00088 virtual Image<double> getDisplayOutput(const int pos = -1) const;
00089
00090
00091 virtual void evolve(const SimTime& simtime) = 0;
00092
00093
00094
00095
00096
00097
00098 virtual void getSimUnit(const Location& loc, std::vector<const SimUnit*>& units) = 0;
00099
00100
00101 virtual void editSimUnit(const Location& loc, std::vector<SimUnit*>& units) = 0;
00102
00103
00104
00105
00106
00107
00108 virtual const uint numSubs() const;
00109
00110
00111 virtual const SimStructure& getSub(const uint sub) const;
00112
00113
00114 virtual SimStructure& editSub(const uint sub);
00115
00116
00117
00118
00119
00120
00121 void setName(const std::string& name);
00122
00123
00124 void setUnits(const std::string& units);
00125
00126
00127 virtual void initialize() = 0;
00128
00129
00130 virtual void setTime(const SimTime& time, const bool recursive = true) = 0;
00131
00132
00133
00134
00135
00136
00137 const std::string getName() const;
00138
00139
00140 const std::string getUnits() const;
00141
00142
00143 const Dims getOutDims() const;
00144
00145
00146 const uint getOutWidth() const;
00147
00148
00149 const uint getOutHeight() const;
00150
00151
00152 const uint getOutSize() const;
00153
00154
00155 virtual const SimTime getTime() const = 0;
00156
00157
00158 virtual const SimTime getTimeStep() const = 0;
00159
00160
00161 virtual SimStructure* clone() const = 0;
00162
00163 protected:
00164
00165 SimStructure(const SimStructure& nlc);
00166 SimStructure& operator=(const SimStructure& nlc);
00167
00168
00169 static void splitExcInh(const Image<double>& input, Image<double>& Exc, Image<double>& Inh);
00170
00171 private:
00172 std::string itsName, itsUnits;
00173 Dims itsOutDims;
00174 };
00175
00176
00177
00178
00179
00180 inline
00181 SimStructure::SimStructure(const uint width, const uint height, const std::string name, const std::string units)
00182 : itsName(name), itsUnits(units), itsOutDims(width, height)
00183 { }
00184
00185
00186 inline
00187 Image<double> SimStructure::getDisplayOutput(const int pos) const
00188 {
00189 return getOutput(pos);
00190 }
00191
00192
00193 inline
00194 const uint SimStructure::numSubs() const
00195 {
00196 return 0;
00197 }
00198
00199
00200 inline
00201 const SimStructure& SimStructure::getSub(const uint sub) const
00202 {
00203 LFATAL("No subcomponents, check numSubs before calling.");
00204 return *this;
00205 }
00206
00207
00208 inline
00209 SimStructure& SimStructure::editSub(const uint sub)
00210 {
00211 LFATAL("No subcomponents, check numSubs before calling.");
00212 return *this;
00213 }
00214
00215
00216 inline
00217 void SimStructure::setName(const std::string& name)
00218 {
00219 itsName = name;
00220 }
00221
00222
00223 inline
00224 void SimStructure::setUnits(const std::string& units)
00225 {
00226 itsUnits = units;
00227 }
00228
00229
00230 inline
00231 const std::string SimStructure::getName() const
00232 {
00233 return itsName;
00234 }
00235
00236
00237 inline
00238 const std::string SimStructure::getUnits() const
00239 {
00240 return itsUnits;
00241 }
00242
00243
00244 inline
00245 const Dims SimStructure::getOutDims() const
00246 {
00247 return itsOutDims;
00248 }
00249
00250
00251 inline
00252 const uint SimStructure::getOutWidth() const
00253 {
00254 return itsOutDims.w();
00255 }
00256
00257
00258 inline
00259 const uint SimStructure::getOutHeight() const
00260 {
00261 return itsOutDims.h();
00262 }
00263
00264
00265 inline
00266 const uint SimStructure::getOutSize() const
00267 {
00268 return itsOutDims.h() * itsOutDims.w();
00269 }
00270
00271
00272 inline
00273 SimStructure::SimStructure(const SimStructure& rhs) :
00274 itsName(rhs.itsName), itsUnits(rhs.itsUnits), itsOutDims(rhs.itsOutDims)
00275 { }
00276
00277
00278 inline
00279 SimStructure& SimStructure::operator=(const SimStructure& rhs)
00280 {
00281 if (this != &rhs)
00282 {
00283 itsName = rhs.itsName;
00284 itsUnits = rhs.itsUnits;
00285 itsOutDims = rhs.itsOutDims;
00286 }
00287 return *this;
00288 }
00289
00290
00291 inline
00292 void SimStructure::splitExcInh(const Image<double>& input, Image<double>& Exc, Image<double>& Inh)
00293 {
00294 Image<double>::const_iterator in_iter(input.begin()), in_end(input.end());
00295 Image<double>::iterator oute_iter(Exc.beginw()), outi_iter(Inh.beginw());
00296
00297 while (in_iter != in_end)
00298 {
00299 if (*in_iter < 0.0)
00300 *outi_iter += *in_iter;
00301 else
00302 *oute_iter += *in_iter;
00303
00304 ++in_iter; ++oute_iter; ++outi_iter;
00305 }
00306 }
00307
00308 #endif
00309
00310
00311
00312
00313