zeq::Event serializeSpikes( const SpikeMap& spikes ) { zeq::Event event( EVENT_SPIKES ); std::vector< Spike > spikeVector; spikeVector.reserve( spikes.size( )); for( std::multimap< float, uint32_t >::const_iterator i = spikes.begin(); i != spikes.end(); ++i ) { spikeVector.push_back( Spike( i->first, i->second )); } flatbuffers::FlatBufferBuilder& fbb = event.getFBB(); auto vector = fbb.CreateVectorOfStructs( spikeVector.data(), spikeVector.size() ); fbb.Finish( CreateSpikes( fbb, vector )); return event; }
void SynapticChannels::updateSpikeList(ftype time) { int nSpikes = 0; int removeKeysSize = 10000; ftype removeKeys[removeKeysSize]; int removeKeyPos; // Remove old spikes and finds number of spikes //SynapseSpikeMapIterator it; for(int syn = 0; syn < synSpikeMap.size(); syn++) { ftype remThresh = 3 * (tau[ 2*synapseTypeList[syn] ] + tau[ 2*synapseTypeList[syn] + 1 ]); // was 2 SpikeMap * synSpikes = synSpikeMap[syn]; SpikeMapIterator itlow, itup; SpikeMapIterator spkIt = synSpikes->begin(); for (removeKeyPos = 0; spkIt != synSpikes->end(); spkIt++) if ( time - spkIt->first > remThresh ) removeKeys[removeKeyPos++] = spkIt->first; while (removeKeyPos > 0) synSpikes->erase(removeKeys[--removeKeyPos]); assert(removeKeyPos < removeKeysSize); // Counts the number of spikes spkIt = synSpikes->begin(); for (; spkIt != synSpikes->end(); spkIt++) nSpikes++; //nSpikes += synSpikes->size(); } /** * tests the number of spikes */ // int testSpike=0; // int testSpike2=0; // for(int syn = 0; syn < synSpikeMap.size(); syn++) { // SpikeMap *synSpikes = synSpikeMap[syn]; // SpikeMapIterator itSpk = synSpikes->begin(); // for (; itSpk != synSpikes->end(); itSpk++) // testSpike++; // testSpike2 += synSpikes->size(); // } // if (testSpike != nSpikes || testSpike2 != nSpikes) // printf("Wrong number of spikes: testSpike=%d|%d nSpikes=%d\n", testSpike, testSpike2, nSpikes); // Apenas o segundo bate. O primeiro às vezes dá maior ou dá menor if (spikeList != 0) delete[] spikeList; spikeListSize = nSpikes; spikeList = new ftype[2*spikeListSize]; // ValGrind synapseWeightList = spikeList + spikeListSize; // Create new list of spikes int spike=0; for (int i=0; i<synapseListSize; i++) synSpikeListPos[i] = 0; bool printA = false; int synTmp=0; for(int syn = 0; syn < synSpikeMap.size(); syn++) { synTmp = syn; synSpikeListPos[syn] = spike; SpikeMap * synSpikes = synSpikeMap[syn]; SpikeMapIterator itSpk = synSpikes->begin(); for (; itSpk != synSpikes->end(); itSpk++) { if (spike < nSpikes) { spikeList[spike] = itSpk->first; synapseWeightList[spike] = itSpk->second; // ValGrind spike++; } } } if (spike < nSpikes) printf("Smaller number of spikes: used=%d allocated=%d\n", spike, nSpikes); else if (spike > nSpikes) printf("Larger number of spikes: used=%d allocated=%d\n", spike, nSpikes); for (synTmp = synTmp + 1; synTmp<synapseListSize; synTmp++) synSpikeListPos[synTmp] = spike; }