/*Copyright (C) 2005, 2006, 2007 Frank Michler, Philipps-University Marburg, Germany This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "sys.hpp" // for libcwd #include "debug.hpp" // for libcwd #include "normalize.hpp" #include "layer.hpp" AbstractNormalize::AbstractNormalize() : SimElement(seNormalize), RewiringOn(false) { } void AbstractNormalize::SetRewiring(float _IncommingConnectivity, float _SynDelThreshold, float _InitialWeights) { RewiringOn=true; IncommingConnectivity=_IncommingConnectivity; SynDelThreshold=_SynDelThreshold; InitialWeights=_InitialWeights; } void AbstractNormalize::SetRewiringOff() { RewiringOn=false; } ////////Normalize////////////////////////////////// Normalize::Normalize() : AbstractNormalize(), Target(0), NTarget(0) { } int Normalize::AddConnection(connection* newcon) { if (Target == 0) { Target = newcon->GetTargetLayer(); NTarget = Target->N; } if (Target == newcon->GetTargetLayer()) ConList.push_back(newcon); else cout << "ERROR: Target-Layer not the same\n"; } int Normalize::proceede(int TotalTime) { } int Normalize::prepare(int Step) { } int Normalize::WriteSimInfo(fstream &fw) { stringstream sstr; sstr << "IdNumber << "\"/> \n"; SimElement::WriteSimInfo(fw, sstr.str()); } int Normalize::WriteSimInfo(fstream &fw, const string &ChildInfo) { stringstream sstr; sstr << "IdNumber << "\"/> \n"; sstr << ChildInfo; SimElement::WriteSimInfo(fw, sstr.str()); } ///////////////////// FiringRateNormalize::FiringRateNormalize(float _NormThresh, float _NormFactor, float _Tau) : PostSynFirePot(0), PostSynLastFirings(0), Tau(_Tau/dt), NormThreshold(_NormThresh), NormFactor(_NormFactor) { cout << "FiringRateNormalization\n"; cout << "Thresh=" << NormThreshold << " Factor=" << NormFactor << " Tau=" << Tau*dt << " ms\n"; } int FiringRateNormalize::AddConnection(connection* newcon) { Normalize::AddConnection(newcon); if (PostSynFirePot == 0) { PostSynFirePot = new float [NTarget]; PostSynLastFirings = new int [NTarget]; int i; for (i=0;ilast_N_firings; int CurTarget; int i,j; while (spike < Target->N_firings) { CurTarget = Target->firings[spike][1]; PostSynFirePot[CurTarget] *= exp(-(t-PostSynLastFirings[CurTarget])/Tau); if (PostSynFirePot[CurTarget] > NormThreshold) { for(vector::iterator it=ConList.begin(); it !=ConList.end(); ++it) { for (i=0;i<(*it)->N_pre[CurTarget];++i) *((*it)->s_pre[CurTarget][i]) *= NormFactor; } } PostSynFirePot[CurTarget] += 1; PostSynLastFirings[CurTarget]=t; ++spike; } } int FiringRateNormalize::prepare(int Step) { int i; for (i=0;i\n"; sstr << "\n"; sstr << "\n"; Normalize::WriteSimInfo(fw, sstr.str()); } int FiringRateNormalize2::AddConnection(connection* newcon) { Normalize::AddConnection(newcon); if (PostSynLastFirings == 0) { PostSynLastFirings = new int [NTarget]; int i; for (i=0;ilast_N_firings; int CurTarget; int i,j, TDiff; float NormFactor=1; while (spike < Target->N_firings) { CurTarget = Target->firings[spike][1]; int TDiff = t-PostSynLastFirings[CurTarget]; if (TDiff < NormLutN) { NormFactor = NormLut[TDiff]; for(vector::iterator it=ConList.begin(); it !=ConList.end(); ++it) { for (i=0;i<(*it)->N_pre[CurTarget];++i) *((*it)->s_pre[CurTarget][i]) *= NormFactor; } } PostSynLastFirings[CurTarget]=t; ++spike; } } int FiringRateNormalize2::prepare(int Step) { int i; for (i=0;ilast_N_firings; int CurTarget; int i,j; while (spike < Target->N_firings) { CurTarget = Target->firings[spike][1]; PostSynFirePot[CurTarget] *= exp(-(t-PostSynLastFirings[CurTarget])/Tau); PostSynFirePot[CurTarget] += 1; PostSynLastFirings[CurTarget]=t; for(vector::iterator it=ConList.begin(); it !=ConList.end(); ++it) { for (i=0;i<(*it)->N_pre[CurTarget];++i) *((*it)->s_pre[CurTarget][i]) += *((*it)->s_pre[CurTarget][i])*NormFactor*(DesiredFirePot-PostSynFirePot[CurTarget]); } ++spike; } } int ConstSFNormalize::prepare(int Step) { int i; for (i=0;i \n"; fw << "IdNumber << "\"/> \n"; fw << " \n"; fw << " \n"; fw << " \n"; } /////////////////////////////////// ConstSumNormalize::ConstSumNormalize(float _WeightSum, bool _quadratic) : WeightSum(_WeightSum), quadratic(_quadratic) { cout << "ConstSumNormalization\n"; cout << "WeightSum=" << WeightSum << " quadratic=" << quadratic << " \n"; } // int ConstSumNormalize::AddConnection(connection* newcon) // { // Normalize::AddConnection(newcon); // } int ConstSumNormalize::proceede(int TotalTime) { int t = int(TotalTime % MacroTimeStep); int spike = Target->last_N_firings; int CurTarget; int i,j; float CurWeightSum, NormFactor; float tmpweight; if (quadratic) { while (spike < Target->N_firings) { CurTarget = Target->firings[spike][1]; // calculate WeightSum CurWeightSum=0; for(vector::iterator it=ConList.begin(); it !=ConList.end(); ++it) { for (i=0;i<(*it)->N_pre[CurTarget];++i) { tmpweight= (*((*it)->s_pre[CurTarget][i])); if (tmpweight <0) { // delete this thread cout << "EEEEEEEEEERRRROOORRR, weight deletion didn't work\n"; fflush(stdout); exit(2); } CurWeightSum += (*((*it)->s_pre[CurTarget][i]))*(*((*it)->s_pre[CurTarget][i])); } } // DEBUG if (CurWeightSum > 100) { for(vector::iterator it=ConList.begin(); it !=ConList.end(); ++it) { cout << "N_pre=" << (*it)->N_pre[CurTarget] << "\n"; for (i=0;i<(*it)->N_pre[CurTarget];++i) { tmpweight= (*((*it)->s_pre[CurTarget][i])); cout << "w"<< i << "=" << tmpweight << "I_pre=" << (*it)->I_pre[CurTarget][i] << "\n"; } } fflush(stdout); exit(2); } // END DEBUG NormFactor = WeightSum/sqrt(CurWeightSum); cout << "NormFactor=" << NormFactor << "WeightSum" << CurWeightSum << "\n"; for(vector::iterator it=ConList.begin(); it !=ConList.end(); ++it) { for (i=0;i<(*it)->N_pre[CurTarget];++i) *((*it)->s_pre[CurTarget][i]) *= NormFactor; } ++spike; } } else { while (spike < Target->N_firings) { CurTarget = Target->firings[spike][1]; // calculate WeightSum CurWeightSum=0; for(vector::iterator it=ConList.begin(); it !=ConList.end(); ++it) { for (i=0;i<(*it)->N_pre[CurTarget];++i) CurWeightSum += *((*it)->s_pre[CurTarget][i]); } NormFactor = WeightSum/CurWeightSum; // multiplicatively normalize weights for(vector::iterator it=ConList.begin(); it !=ConList.end(); ++it) { for (i=0;i<(*it)->N_pre[CurTarget];++i) *((*it)->s_pre[CurTarget][i]) *= NormFactor; } ++spike; } } } int ConstSumNormalize::NormalizeAll() { cout << "Normalizing All ..."; int CurTarget; int i,j; float CurWeightSum, NormFactor; if (quadratic) { for (CurTarget=0;CurTargetN;++CurTarget) { CurWeightSum=0; // wie oben for(vector::iterator it=ConList.begin(); it !=ConList.end(); ++it) { for (i=0;i<(*it)->N_pre[CurTarget];++i) CurWeightSum += (*((*it)->s_pre[CurTarget][i]))*(*((*it)->s_pre[CurTarget][i])); } NormFactor = WeightSum/sqrt(CurWeightSum); for(vector::iterator it=ConList.begin(); it !=ConList.end(); ++it) { for (i=0;i<(*it)->N_pre[CurTarget];++i) *((*it)->s_pre[CurTarget][i]) *= NormFactor; } } } else { for (CurTarget=0;CurTargetN;++CurTarget) { // calculate WeightSum CurWeightSum=0; for(vector::iterator it=ConList.begin(); it !=ConList.end(); ++it) { for (i=0;i<(*it)->N_pre[CurTarget];++i) CurWeightSum += *((*it)->s_pre[CurTarget][i]); } NormFactor = WeightSum/CurWeightSum; for(vector::iterator it=ConList.begin(); it !=ConList.end(); ++it) { for (i=0;i<(*it)->N_pre[CurTarget];++i) *((*it)->s_pre[CurTarget][i]) *= NormFactor; } } } cout << " [done]\n"; } void ConstSumNormalize::CalcInitWeightSum() { cout << "Calculating Initial Weight Sum ..."; int CurTarget; int i,j; float CurWeightSum, NormFactor; float TmpWeightSum=0; if (quadratic) { for (CurTarget=0;CurTargetN;++CurTarget) { CurWeightSum=0; // wie oben for(vector::iterator it=ConList.begin(); it !=ConList.end(); ++it) { for (i=0;i<(*it)->N_pre[CurTarget];++i) CurWeightSum += (*((*it)->s_pre[CurTarget][i]))*(*((*it)->s_pre[CurTarget][i])); } TmpWeightSum += sqrt(CurWeightSum); } WeightSum = TmpWeightSum/Target->N; } else { for (CurTarget=0;CurTargetN;++CurTarget) { // calculate WeightSum CurWeightSum=0; for(vector::iterator it=ConList.begin(); it !=ConList.end(); ++it) { for (i=0;i<(*it)->N_pre[CurTarget];++i) CurWeightSum += *((*it)->s_pre[CurTarget][i]); } TmpWeightSum += CurWeightSum; } WeightSum = TmpWeightSum/Target->N; } cout << " [done]\n"; } float ConstSumNormalize::GetWeightSum() { return WeightSum; } int ConstSumNormalize::SetWeightSum(float NewWeightSum) { WeightSum=NewWeightSum; } int ConstSumNormalize::WriteSimInfo(fstream &fw) { stringstream sstr; sstr << " \n"; sstr << " \n"; Normalize::WriteSimInfo(fw, sstr.str()); } // int ConstSumNormalize::prepare(int Step) // { // } ///////////////////// NormalizePsp::NormalizePsp(float _NormThresh, float _NormFactor) : NormThreshold(_NormThresh), NormFactor(_NormFactor), PspPot(0) { cout << "NormalizePsp\n"; cout << "Thresh=" << NormThreshold << " Factor=" << NormFactor << "\n"; } int NormalizePsp::AddConnection(connection* newcon) { Normalize::AddConnection(newcon); if (PspPot == 0) { PspPot = Target->GetPspPointer(csimInputChannel_AMPA); //ToDo: Info aus connectio nverwenden } } int NormalizePsp::proceede(int TotalTime) { int t = int(TotalTime % MacroTimeStep); int spike = Target->last_N_firings; int CurTarget; int i,j; while (spike < Target->N_firings) { CurTarget = Target->firings[spike][1]; if (PspPot[CurTarget] > NormThreshold) { for(vector::iterator it=ConList.begin(); it !=ConList.end(); ++it) { for (i=0;i<(*it)->N_pre[CurTarget];++i) *((*it)->s_pre[CurTarget][i]) *= NormFactor; } } ++spike; } } int NormalizePsp::WriteSimInfo(fstream &fw) { stringstream sstr; sstr << " \n"; sstr << " \n"; Normalize::WriteSimInfo(fw, sstr.str()); }