00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "PatternManager.h"
00025 #include "Debug.h"
00026 #include "Utilities.h"
00027 #include "PatternTypes.h"
00028 #include "SpikeStreamSimulation.h"
00029
00030
00031 #include <iostream>
00032 #include <mysql++.h>
00033 using namespace mysqlpp;
00034 using namespace std;
00035
00036
00037
00038 PatternManager::PatternManager(DBInterface *netDBInter, DBInterface *pattDBInter, unsigned int neurGrpID, unsigned int pattGrpID){
00039
00040 networkDBInterface = netDBInter;
00041 patternDBInterface = pattDBInter;
00042
00043
00044 neuronGrpID = neurGrpID;
00045
00046
00047 bufferCounter = 0;
00048 patternLoaded = false;
00049 rotatePattern = false;
00050 patternGrpID = 0;
00051
00052
00053 try{
00054 patternConnection = patternDBInterface->getNewConnection();
00055 if(!patternConnection){
00056 SpikeStreamSimulation::systemError("PatternManager: NEW CONNECTION TO DATABASE FAILED");
00057 return;
00058 }
00059 patternQuery = new Query(patternConnection->query());
00060 }
00061 catch (const Exception& er) {
00062 ostringstream errorStrStream;
00063 errorStrStream<<"Exception thrown getting pattern query: \""<<er.what()<<"\"";
00064 SpikeStreamSimulation::systemError(errorStrStream.str());
00065 return;
00066 }
00067
00068
00069 loadPatternGroup(pattGrpID);
00070 }
00071
00072
00073
00074 PatternManager::~ PatternManager(){
00075 #ifdef MEMORY_DEBUG
00076 cout<<"DESTROYING PATTERN MANAGER"<<endl;
00077 #endif//MEMORY_DEBUG
00078
00079 if(patternLoaded){
00080 unloadPatternGroup();
00081 }
00082
00083
00084 delete patternQuery;
00085
00086
00087 patternConnection->close();
00088 }
00089
00090
00091
00092
00093
00094
00095
00096 void PatternManager::fireNeurons(){
00097
00098 if(!patternLoaded)
00099 return;
00100
00101
00102 for(vector<unsigned int>::iterator iter = patternBuffer[bufferCounter].begin(); iter != patternBuffer[bufferCounter].end(); ++iter){
00103 neuronArray[*iter]->fireNeuron();
00104 }
00105
00106
00107 if(patternType == TEMPORAL_PATTERN_VALUE){
00108 patternBuffer[bufferCounter].clear();
00109 ++bufferCounter;
00110 bufferCounter = bufferCounter % NUMBER_OF_DELAY_VALUES;
00111 }
00112 }
00113
00114
00115
00116
00117
00118
00119 void PatternManager::loadPatternData(){
00120
00121
00122
00123 if(!patternLoaded){
00124 return;
00125 }
00126
00127
00128
00129 if(patternType == STATIC_PATTERN_VALUE)
00130 patternBuffer[0].clear();
00131
00132
00133 try{
00134 Row patternRow = patternResults->fetch_row();
00135 string patternDataString = (std::string) patternRow["Pattern"];
00136 fillPatternArray(patternDataString);
00137
00138
00139
00140
00141 if(rotatePattern == false){
00142 for(unsigned int i=0; i<neuronGrpLength; ++i){
00143 for(unsigned int j=0; j < neuronGrpWidth; ++j){
00144 int neuronArrayIndex = j + i*neuronGrpWidth;
00145 int patternArrayIndex = j + (neuronGrpLength - i - 1) * neuronGrpWidth;
00146
00147
00148 if(patternType == STATIC_PATTERN_VALUE){
00149 if(patternArray[patternArrayIndex] == 1){
00150 patternBuffer[0].push_back(neuronArrayIndex);
00151 }
00152 }
00153
00154 else{
00155 if(patternArray[patternArrayIndex] > -1){
00156 int insertionPosition = (bufferCounter + patternArray[patternArrayIndex] ) % NUMBER_OF_DELAY_VALUES;
00157 patternBuffer[insertionPosition].push_back(neuronArrayIndex);
00158 }
00159 }
00160 }
00161 }
00162 }
00163 else{
00164 SpikeStreamSimulation::systemError("PATTERN ROTATION NOT IMPLEMENTED YET.");
00165 }
00166
00167 #ifdef PATTERN_DEBUG
00168 cout<<"Pattern data loaded"<<endl;
00169 #endif//PATTERN_DEBUG
00170
00171 }
00172 catch (const EndOfResults& er) {
00173
00174 cout<<"PatternManager: End of pattern. Stopping"<<endl;
00175 unloadPatternGroup();
00176 }
00177 catch (const BadQuery& er) {
00178 ostringstream errorStrStream;
00179 errorStrStream<<"Bad query when loading pattern data: \""<<er.what()<<"\"";
00180 SpikeStreamSimulation::systemError(errorStrStream.str());
00181 }
00182 catch (const Exception& er) {
00183 ostringstream errorStrStream;
00184 errorStrStream<<"Exception thrown loading pattern data: \""<<er.what()<<"\"";
00185 SpikeStreamSimulation::systemError(errorStrStream.str());
00186 }
00187 catch(std::exception& er){
00188 ostringstream errorStrStream;
00189 errorStrStream<<"Exception thrown loading pattern data: \""<<er.what()<<"\"";
00190 SpikeStreamSimulation::systemError(errorStrStream.str());
00191 }
00192 }
00193
00194
00195
00196 void PatternManager::setNeuronArray(Neuron **neurArr, int neurArrLen){
00197 neuronArray = neurArr;
00198 numberOfNeurons = neurArrLen;
00199 }
00200
00201
00202
00203
00204
00205
00206
00207
00208 void PatternManager::fillPatternArray(string &patternString){
00209 int patternCounter = 0;
00210 string tempString = "";
00211 for(unsigned int stringCounter = 0; stringCounter < patternString.length(); ++stringCounter){
00212 if((patternString[stringCounter] == '-') || isdigit(patternString[stringCounter])){
00213
00214
00215 while(((patternString[stringCounter] == '-') || isdigit(patternString[stringCounter])) && stringCounter != patternString.length()){
00216 tempString += patternString[stringCounter];
00217 ++stringCounter;
00218 }
00219
00220
00221
00222 if(patternCounter >= patternArrayLength){
00223 ostringstream errorStrStream;
00224 errorStrStream<<"PatternManager: ERROR FILLING PATTERN ARRAY: TOO MANY NUMBERS "<<"PatternCounter = "<<patternCounter<<" length = "<<patternArrayLength<<endl;
00225 SpikeStreamSimulation::systemError(errorStrStream.str());
00226 break;
00227 }
00228
00229 try{
00230 patternArray[patternCounter] = Utilities::getInt(tempString);
00231 }
00232 catch(std::exception& er){
00233 ostringstream errorStrStream;
00234 errorStrStream<<"Exception thrown extracting integer from pattern array: \""<<er.what()<<"\"";
00235 SpikeStreamSimulation::systemError(errorStrStream.str());
00236 break;
00237 }
00238 ++patternCounter;
00239 tempString = "";
00240 }
00241
00242 }
00243
00244
00245
00246
00247 if(patternCounter != patternArrayLength){
00248 ostringstream errorStrStream;
00249 errorStrStream<<"PatternManager: ERROR FILLING PATTERN ARRAY: PROBABLY TOO FEW NUMBERS "<<"PatternCounter = "<<patternCounter<<" length = "<<patternArrayLength<<endl;
00250 SpikeStreamSimulation::systemError(errorStrStream.str());
00251 }
00252
00253 #ifdef PATTERN_DEBUG
00254 cout<<"==================================== START PATTERN ARRAY ==============================="<<endl;
00255 for(int i=0; i<patternArrayLength; ++i)
00256 cout<<"Pattern array: "<<i<<" "<<patternArray[i]<<endl;
00257 cout<<"===================================== END PATTERN ARRAY ==============================="<<endl;
00258 #endif//PATTERN_DEBUG
00259 }
00260
00261
00262
00263
00264 void PatternManager::loadPatternGroup(unsigned int pattGrpID){
00265
00266 patternGrpID = pattGrpID;
00267
00268
00269 if(patternLoaded){
00270 unloadPatternGroup();
00271 }
00272
00273
00274
00275
00276
00277 try{
00278 Query networkQuery = networkDBInterface->getQuery();
00279 networkQuery.reset();
00280 networkQuery<<"SELECT Width, Length FROM NeuronGroups WHERE NeuronGrpID = "<<neuronGrpID;
00281 Result networkResults = networkQuery.store();
00282 Row networkRow(*networkResults.begin());
00283 neuronGrpWidth = Utilities::getUInt((std::string)networkRow["Width"]);
00284 neuronGrpLength = Utilities::getUInt((std::string)networkRow["Length"]);
00285
00286
00287 Query tempPattQuery = patternDBInterface->getQuery();
00288 tempPattQuery.reset();
00289 tempPattQuery<<"SELECT Width, Length, PatternType FROM PatternDescriptions WHERE PatternGrpID = "<<patternGrpID;
00290 Result tempPattResults = tempPattQuery.store();
00291 Row tempPattRow(*tempPattResults.begin());
00292 patternType = Utilities::getUInt((std::string)tempPattRow["PatternType"]);
00293 unsigned int patternWidth = Utilities::getUInt((std::string)tempPattRow["Width"]);
00294 unsigned int patternLength = Utilities::getUInt((std::string)tempPattRow["Length"]);
00295
00296
00297
00298 if(neuronGrpWidth == patternWidth && neuronGrpLength == patternLength){
00299 rotatePattern = false;
00300 }
00301 else if(neuronGrpWidth == patternLength && neuronGrpLength == patternWidth){
00302 rotatePattern = true;
00303 SpikeStreamSimulation::systemError("PatternManager: ROTATION NOT IMPLEMENTED\nPATTERN DOES NOT MATCH NEURON GROUP WIDTH AND LENGTH.");
00304 return;
00305 }
00306 else{
00307 SpikeStreamSimulation::systemError("PatternManager: PATTERN DOES NOT MATCH NEURON GROUP WIDTH AND LENGTH");
00308 return;
00309 }
00310
00311
00312 patternArrayLength = patternWidth * patternLength;
00313 patternArray = new int[patternArrayLength];
00314
00315
00316 patternQuery->reset();
00317 (*patternQuery)<<"SELECT PatternID, Pattern FROM PatternData WHERE PatternGrpID = "<<patternGrpID<<" ORDER BY PatternID";
00318 patternResults = new ResUse(patternQuery->use());
00319
00320 }
00321 catch (const BadQuery& er) {
00322 ostringstream errorStrStream;
00323 errorStrStream<<"Bad query when loading pattern group: \""<<er.what()<<"\"";
00324 SpikeStreamSimulation::systemError(errorStrStream.str());
00325 return;
00326 }
00327 catch (const Exception& er) {
00328 ostringstream errorStrStream;
00329 errorStrStream<<"Exception thrown loading pattern group: \""<<er.what()<<"\"";
00330 SpikeStreamSimulation::systemError(errorStrStream.str());
00331 return;
00332 }
00333 catch(std::exception& er){
00334 ostringstream errorStrStream;
00335 errorStrStream<<"Exception thrown loading pattern group: \""<<er.what()<<"\"";
00336 SpikeStreamSimulation::systemError(errorStrStream.str());
00337 return;
00338 }
00339
00340
00341
00342 if(!(*patternResults)){
00343 SpikeStreamSimulation::systemError("PatternManager: SQL ERROR");
00344 return;
00345 }
00346
00347 #ifdef PATTERN_DEBUG
00348 cout<<"Pattern description loaded."<<endl;
00349 #endif//PATTERN_DEBUG
00350
00351
00352 patternLoaded = true;
00353
00354
00355 loadPatternData();
00356 }
00357
00358
00359
00360 void PatternManager::unloadPatternGroup(){
00361 delete patternResults;
00362 patternGrpID = 0;
00363 patternLoaded = false;
00364
00365
00366 for(int i=0; i<NUMBER_OF_DELAY_VALUES; ++i)
00367 patternBuffer[i].clear();
00368
00369
00370 delete [] patternArray;
00371 }
00372
00373