/*
* utils.cpp
*
* This file is part of the refactored Izhikevich polychronization model application.
*
* Copyright (C) 2018, Author: G. Trensch
*
* The refactored Izhikevich polychronization model application 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.
*
* It 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 application. If not, see .
*
*/
#include "params.h"
#if( __RUN_REFACTORED_VERSION__ )
#define __IMPORT_GLOBAL_VARIABLES__ true
#include
#include
#include
#include
#include
#include "globals.h"
#include "utils.h"
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// = E X P O R T N E T W O R K S T A T E S
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// = Export connection matrix to file in printable ASCII format.
// =
// = 001 002 100 <- synapse
// = Source neuron 0001 nnn nnn nnn nnn nnn nnn ... nnn
// = Source neuron 0002 nnn nnn nnn nnn nnn nnn ... nnn
// = ...
// = Source neuron 1000 nnn nnn nnn nnn nnn nnn ... nnn
// =
// = nnn ... target neuron id
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
void ExportConnectionMatrixToFile( const char *pFileName ) {
FILE *pFile = fopen( pFileName, "w" );
if( pFile == nullptr ) {
printf( "[ERROR] Failed to open file: %s (errno: %d)\n", pFileName, errno);
exit(RC_ERROR_EXIT);
}
printf( "[INFO] Export connection matrix to file: %s\n", pFileName );
for( int n = 0; n < NUM_TOTAL_NEURONS; ++n ) {
for( int s = 0; s < NUM_SYNAPSES_PER_NEURON; ++s ) {
fprintf( pFile, "%03d ", matrixOfPostSynapticNeurons[n][s] );
}
fprintf( pFile, "\n" );
}
fclose( pFile );
}
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// = Export weight matrix to file in printable ASCII format.
// =
// = 001 002 100 <- synapse
// = Source neuron 0001 ww.wwww ww.wwww ww.wwww ww.wwww ... ww.wwww
// = Source neuron 0002 ww.wwww ww.wwww ww.wwww ww.wwww ... ww.wwww
// = ...
// = Source neuron 1000 ww.wwww ww.wwww ww.wwww ww.wwww ... ww.wwww
// =
// = ww.wwww ... synaptic strength
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
void ExportWeightMatrixToFile( const char *pFileName ) {
FILE *pFile = fopen( pFileName, "w" );
if( pFile == nullptr ) {
printf( "[ERROR] Failed to open file: %s (errno: %d)\n", pFileName, errno);
exit(RC_ERROR_EXIT);
}
printf( "[INFO] Export weight matrix to file: %s\n", pFileName );
for( int n = 0; n < NUM_TOTAL_NEURONS; ++n ) {
for( int s = 0; s < NUM_SYNAPSES_PER_NEURON; ++s ) {
fprintf( pFile, "%f ", matrixOfSynapticWeights[n][s] );
}
fprintf( pFile, "\n" );
}
fclose( pFile );
}
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// = Export delay matrix to file in printable ASCII format.
// =
// = 001 002 100 <- synapse
// = Source neuron 0001 ddd ddd ddd ddd ddd ddd ... ddd
// = Source neuron 0002 ddd ddd ddd ddd ddd ddd ... ddd
// = ...
// = Source neuron 1000 ddd ddd ddd ddd ddd ddd ... ddd
// =
// = ddd ... conduction delay
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
void ExportDelayMatrixToFile( const char *pFileName ) {
FILE *pFile = fopen( pFileName, "w" );
if( pFile == nullptr ) {
printf( "[ERROR] Failed to open file: %s (errno: %d)\n", pFileName, errno);
exit(RC_ERROR_EXIT);
}
printf( "[INFO] Export delay matrix to file: %s\n", pFileName );
for( int n = 0; n < NUM_TOTAL_NEURONS; ++n ) {
for( int s = 0; s < NUM_SYNAPSES_PER_NEURON; ++s ) {
int delayValue = GetDelayOfConnection( n, s );
fprintf( pFile, "%03d ", delayValue );
}
fprintf( pFile, "\n" );
}
fclose( pFile );
}
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// = Export connection, weight, and delay matrix to file for import into PyNN.
// =
// =
// = exc_exc_connections = [
// = ( source neuron, target neuron, weight, delay ), ...,
// = ... , ( source neuron, target neuron, weight, delay )
// = ]
// =
// = exc_inh_connections = [
// = ( source neuron, target neuron, weight, delay ), ...,
// = ... , ( source neuron, target neuron, weight, delay )
// = ]
// = inh_exc_connections = [
// = ( source neuron, target neuron, weight, delay ), ...,
// = ... , ( source neuron, target neuron, weight, delay )
// = ]
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
void ExportConnectionMatrixWeightAndDelay( const char *pFileName ) {
const int CONST_ENTRIES_PER_LINE = 8;
FILE *pFile = fopen( pFileName, "w" );
if( pFile == nullptr ) {
printf( "[ERROR] Failed to open file: %s (errno: %d)\n", pFileName, errno);
exit(RC_ERROR_EXIT);
}
printf( "[INFO] Export connection, weight and delay matrix for import into PyNN to file: %s\n", pFileName );
// excitatory to excitatory connections
fprintf( pFile, "exc_exc_connections = [\n" );
int entriesCount = 0;
for( int excPreSynNeuron = 0; excPreSynNeuron < NUM_EXCITATORY_NEURONS; ++excPreSynNeuron ) {
for( int synapse = 0; synapse < NUM_SYNAPSES_PER_NEURON; ++synapse ) {
if( matrixOfPostSynapticNeurons[excPreSynNeuron][synapse] < NUM_EXCITATORY_NEURONS ) {
int excPostSynNeuron = matrixOfPostSynapticNeurons[excPreSynNeuron][synapse];
double weight = fabs( matrixOfSynapticWeights[excPreSynNeuron][synapse] ); // PyNN expects positive weight values for inhibitory synapses
double delay = GetDelayOfConnection( excPreSynNeuron, synapse );
fprintf( pFile, "( %3d, %3d, %f, %f ), ", excPreSynNeuron, excPostSynNeuron, weight, delay );
entriesCount++;
if( entriesCount == CONST_ENTRIES_PER_LINE ) {
fprintf( pFile, "\n" );
entriesCount = 0;
}
}
}
}
fprintf( pFile, "]\n\n" );
// excitatory to inhibitory connections
fprintf( pFile, "exc_inh_connections = [\n" );
entriesCount = 0;
for( int excPreSynNeuron = 0; excPreSynNeuron < NUM_EXCITATORY_NEURONS; ++excPreSynNeuron ) {
for( int synapse = 0; synapse < NUM_SYNAPSES_PER_NEURON; ++synapse ) {
if( matrixOfPostSynapticNeurons[excPreSynNeuron][synapse] >= NUM_EXCITATORY_NEURONS) {
int inhPostSynNeuron = matrixOfPostSynapticNeurons[excPreSynNeuron][synapse];
double weight = fabs( matrixOfSynapticWeights[excPreSynNeuron][synapse] ); // PyNN expects positive weight values for inhibitory synapses
double delay = GetDelayOfConnection( excPreSynNeuron, synapse );
fprintf( pFile, "( %3d, %3d, %f, %f ), "
, excPreSynNeuron, inhPostSynNeuron - NUM_EXCITATORY_NEURONS, weight, delay );
entriesCount++;
if( entriesCount == CONST_ENTRIES_PER_LINE ) {
fprintf( pFile, "\n" );
entriesCount = 0;
}
}
}
}
fprintf( pFile, "]\n\n" );
// inhibitory to excitatory connections
entriesCount = 0;
fprintf( pFile, "inh_exc_connections = [\n" );
for( int inhPreSynNeuron = NUM_EXCITATORY_NEURONS; inhPreSynNeuron < NUM_TOTAL_NEURONS; ++inhPreSynNeuron ) {
for( int synapse = 0; synapse < NUM_SYNAPSES_PER_NEURON; ++synapse ) {
if( matrixOfPostSynapticNeurons[inhPreSynNeuron][synapse] < NUM_EXCITATORY_NEURONS) {
int excPostSynNeuron = matrixOfPostSynapticNeurons[inhPreSynNeuron][synapse];
double weight = fabs( matrixOfSynapticWeights[inhPreSynNeuron][synapse] ); // PyNN expects positive weight values for inhibitory synapses
double delay = GetDelayOfConnection( inhPreSynNeuron, synapse );
fprintf( pFile, "( %3d, %3d, %6.3f, %6.3f ), "
, inhPreSynNeuron - NUM_EXCITATORY_NEURONS, excPostSynNeuron, weight, delay );
entriesCount++;
if( entriesCount == CONST_ENTRIES_PER_LINE ) {
fprintf( pFile, "\n" );
entriesCount = 0;
}
}
}
}
fprintf( pFile, "]\n\n" );
fclose( pFile );
}
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// = I M P O R T N E T W O R K S T A T E S
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// = Import the connection matrix from file generated with
// = ExportConnectionMatrixToFile().
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
void ImportConnectionMatrixFromFile( const char *pFileName ) {
FILE *pFile = fopen( pFileName, "r" );
if( pFile == nullptr ) {
printf( "[ERROR] Failed to open file: %s (errno: %d)\n", pFileName, errno);
exit(RC_ERROR_EXIT);
}
printf( "[INFO] Import connection matrix from file: %s\n", pFileName );
char line[NUM_SYNAPSES_PER_NEURON * SIZE_OF_ENTRY_NEURON] = {};
int targetNeuron = 0;
char *pToken = nullptr;
for( int n = 0; n < NUM_TOTAL_NEURONS; ++n ) {
fgets( line, sizeof( line ), pFile );
// first token, i.e. synapse 0 target neuron
pToken = strtok( line, " " );
targetNeuron = atoi( pToken );
matrixOfPostSynapticNeurons[n][0] = targetNeuron;
// subsequent tokens, i.e. synapses 1 .. s
for( int s = 1; s < NUM_SYNAPSES_PER_NEURON; ++s ) {
pToken = strtok( NULL, " " );
targetNeuron = atoi( pToken );
matrixOfPostSynapticNeurons[n][s] = targetNeuron;
}
}
fclose( pFile );
}
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// = Import the weight matrix from file generated with
// = ExportWeightMatrixToFile().
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
void ImportWeightMatrixFromFile( const char *pFileName ) {
FILE *pFile = fopen( pFileName, "r" );
if( pFile == nullptr ) {
printf( "[ERROR] Failed to open file: %s (errno: %d)\n", pFileName, errno );
exit( RC_ERROR_EXIT );
}
printf( "[INFO] Import weight matrix from file: %s\n", pFileName );
char line[NUM_SYNAPSES_PER_NEURON * SIZE_OF_ENTRY_WEIGHT] = {};
double weight = 0.0;
char *pToken = nullptr;
for( int n = 0; n < NUM_TOTAL_NEURONS; ++n ) {
fgets( line, sizeof( line ), pFile );
// first token, i.e. weight of connection synapse 0 of target neuron n
pToken = strtok( line, " " );
weight = atof( pToken );
matrixOfSynapticWeights[n][0] = weight;
// subsequent tokens, i.e. weights of connections synapses s of target neuron n
for( int s = 1; s < NUM_SYNAPSES_PER_NEURON; ++s ) {
pToken = strtok( NULL, " " );
weight = atof( pToken );
matrixOfSynapticWeights[n][s] = weight;
}
}
fclose( pFile );
}
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// = Import the delay matrix from file generated with
// = ExportDelayMatrixToFile().
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
void ImportDelayMatrixFromFile( const char *pFileName ) {
FILE *pFile = fopen( pFileName, "r" );
if( pFile == nullptr ) {
printf( "[ERROR] Failed to open file: %s (errno: %d)\n", pFileName, errno );
exit( RC_ERROR_EXIT );
}
printf( "[INFO] Import delay matrix from file: %s\n", pFileName );
char line[NUM_SYNAPSES_PER_NEURON * SIZE_OF_ENTRY_DELAY] = {};
char *pToken = nullptr;
for( int n = 0; n < NUM_TOTAL_NEURONS; ++n ) {
fgets( line, sizeof( line ), pFile );
// first token, i.e. delay of synapse 0
pToken = strtok( line, " " );
int delayIdx = atoi( pToken ) - 1;
int idx = numEntriesPerDelay[n][delayIdx];
listOfSynsByNeuronAndDelay[n][delayIdx][idx] = 0; // synapse 0
numEntriesPerDelay[n][delayIdx]++;
// subsequent tokens, i.e. delays of synapses s
for( int s = 1; s < NUM_SYNAPSES_PER_NEURON; ++s ) {
pToken = strtok( NULL, " " );
delayIdx = atoi( pToken ) - 1;
idx = numEntriesPerDelay[n][delayIdx];
listOfSynsByNeuronAndDelay[n][delayIdx][idx] = s;
numEntriesPerDelay[n][delayIdx]++;
}
}
fclose( pFile );
}
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// = R E C O R D E X T E R N A L S T I M U L U S
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// = Record the random input data the network is stimulated with.
// =
// = second millisecond id of the neuron that receives the input
// = ssssss mmm nnn
// = ...
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
void RecordRandomStimulusToFile( const char *pFileName, int simTimeSecond, int simTimeMillisecond, int inputNeuron ) {
if( pFileStimulusOutput == nullptr ) {
printf( "[ERROR] File not open: %s (errno: %d)\n", pFileName, errno );
exit( RC_ERROR_EXIT );
}
if( inputNeuron > 0 ) {
fprintf( pFileStimulusOutput, "%06d %03d %03d\n", simTimeSecond, simTimeMillisecond, inputNeuron );
}
}
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// = R E A D E X T E R N A L S T I M U L U S
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// = Read next record from external stimulus file and return the neuron id.
// =
// = second millisecond id of the neuron that receives the input
// = ssssss mmm nnn
// = ...
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
int GetNextExternalStimulusFromFile( const char *pFileName, int simTimeSecond, int t ) {
char line[32] = {};
char *pToken = nullptr;
if( pFileStimulusInput == nullptr ) {
printf( "[ERROR] File not open: %s (errno: %d)\n", pFileName, errno );
exit( RC_ERROR_EXIT );
}
if( !fgets( line, sizeof( line ), pFileStimulusInput )) {
printf( "[ERROR] Unexpected end of file while reading stimulus data. Simulation time: %ds %dms Filename: %s\n"
, simTimeSecond, t, pFileName );
exit( RC_ERROR_EXIT );
}
pToken = strtok( line, " " );
if( pToken == nullptr ) {
return RC_NOID;
}
pToken = strtok( nullptr, " " );
if( pToken == nullptr ) {
return RC_NOID;
}
pToken = strtok( nullptr, " " );
if( pToken == nullptr ) {
return RC_NOID;
}
int neuronId = atoi( pToken );
return neuronId;
}
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// = R E C O R D N E T W O R K A C T I V I T Y D A T A
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// = Write the spike times to file in a printable ASCII format.
// =
// = second millisecond id of the neuron that has fired
// = ssssss mmm nnn
// = ...
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
void RecordNetworkActivityToFile( const char *pFileName, int simulationSecond, int numFirings ) {
FILE *pFile = fopen( pFileName, "a+" );
if( pFile == nullptr ) {
printf( "[ERROR] Failed to open file: %s (errno: %d)\n", pFileName, errno );
exit( RC_ERROR_EXIT );
}
// skip negative times
int idx = 0;
while( firings[idx][TIME] < 0 ) {
idx++;
}
for( ; idx < numFirings; ++idx ) {
fprintf( pFile, "%06d %03d %03d\n", simulationSecond, firings[idx][TIME], firings[idx][NEURON] );
}
fclose( pFile );
}
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// = H E L P E R F U N C T I O N S
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// = Return the delay value of a connection.
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
int GetDelayOfConnection( int preSynNeuron, int synapse ) {
int delay = 0;
for( int delayIdx = 0; delayIdx < MAX_SYNAPSE_DELAY; ++delayIdx ) {
int preSynNeuron_numEntriesOfDelay = numEntriesPerDelay[preSynNeuron][delayIdx];
for( int i = 0; i < preSynNeuron_numEntriesOfDelay; ++i ) {
if( synapse == listOfSynsByNeuronAndDelay[preSynNeuron][delayIdx][i] ) {
delay = delayIdx + 1; // index 0 corresponds to 1ms delay
}
}
}
return delay;
}
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// = Delete a file from disk.
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
void DeleteFile( const char *fileName ) {
if( remove( fileName ) == 0 ) {
printf( "[INFO] File deleted: %s\n", fileName );
}
else {
printf( "[INFO] File could not be deleted: %s\n", fileName );
}
}
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// = D E B U G F U N C T I O N S
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// = Debugprint: connection matrix
// =
// = Matrix of Post Synaptic Neurons
// =
// = 0 1 2 3 4 5 6 7 8 9 ... <- synapse
// = -------------------------------------------------------- ...
// = 0 : 840 394 783 798 911 197 335 768 277 553 ...
// = 1 : 950 920 147 881 641 431 619 281 786 307 ... <- target neuron id
// = 2 : 76 649 248 629 229 700 316 328 231 74 ...
// = 3 : 291 180 684 727 139 603 492 838 724 178 ...
// = 4 : 98 923 169 481 225 826 290 357 878 344 ...
// = 5 : 324 874 589 637 759 775 794 262 604 470 ...
// = 6 : 887 933 173 447 487 795 639 965 155 292 ...
// = 7 : 347 205 522 400 307 679 645 443 269 703 ...
// = 8 : 452 160 308 433 5 649 126 461 84 780 ...
// = 9 : 805 749 398 366 394 272 599 68 901 432 ...
// = 10 : 20 53 897 899 39 419 183 219 778 622 ...
// = ....
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
void PrintMatrixOfPostSynapticNeurons() {
printf( " Matrix of Post Synaptic Neurons\n\n" );
printf( " " );
for( int s = 0; s < NUM_SYNAPSES_PER_NEURON; ++s ) {
printf( " %3d ", s );
}
printf( "\n" );
printf( "-------" );
for( int s = 0; s < NUM_SYNAPSES_PER_NEURON; ++s ) {
printf( "-----" );
}
printf( " \n" );
for( int n = 0; n < NUM_TOTAL_NEURONS; ++n ) {
printf( "%3d : ", n );
for( int s = 0; s < NUM_SYNAPSES_PER_NEURON; ++s ) {
printf( " %3d ", matrixOfPostSynapticNeurons[n][s] );
}
printf( "\n" );
}
printf( "Press enter ...\n" );
getchar();
}
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// = Debugprint: weight matrix
// =
// = Matrix of Synaptic Weights
// =
// = 0 1 2 3 4 ... <- synapse
// = --------------------------------------------------------- ...
// = 0 : 6.000000 6.000000 6.000000 6.000000 6.000000 ...
// = 1 : 6.000000 6.000000 6.000000 6.000000 6.000000 ... <- connection strength
// = 2 : 6.000000 6.000000 6.000000 6.000000 6.000000 ...
// = 3 : 6.000000 6.000000 6.000000 6.000000 6.000000 ...
// = 4 : 6.000000 6.000000 6.000000 6.000000 6.000000 ...
// = 5 : 6.000000 6.000000 6.000000 6.000000 6.000000 ...
// = 6 : 6.000000 6.000000 6.000000 6.000000 6.000000 ...
// = 7 : 6.000000 6.000000 6.000000 6.000000 6.000000 ...
// = 8 : 6.000000 6.000000 6.000000 6.000000 6.000000 ...
// = 9 : 6.000000 6.000000 6.000000 6.000000 6.000000 ...
// = 10 : 6.000000 6.000000 6.000000 6.000000 6.000000 ...
// = ....
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
void PrintMatrixOfSynapticWeights() {
printf( " Matrix of Synaptic Weights\n\n" );
printf( " " );
for( int s = 0; s < NUM_SYNAPSES_PER_NEURON; ++s ) {
printf( " %8d ", s );
}
printf( "\n" );
printf( "-------" );
for( int s = 0; s < NUM_SYNAPSES_PER_NEURON; ++s ) {
printf( "----------" );
}
printf( " \n" );
for( int n = 0; n < NUM_TOTAL_NEURONS; ++n ) {
printf( "%3d : ", n );
for( int s = 0; s < NUM_SYNAPSES_PER_NEURON; ++s ) {
printf( " %f ", matrixOfSynapticWeights[n][s] );
}
printf( "\n" );
}
printf( "Press enter ...\n" );
getchar();
}
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// = Debugprint: delay matrix
// =
// = Matrix of Synaptic Delays
// =
// = 0 1 2 3 4 5 6 7 8 9 10 ... <- synapse
// = -------------------------------------------------------------- ...
// = 0 : 001 001 001 001 001 002 002 002 002 002 003 ...
// = 1 : 001 001 001 001 001 002 002 002 002 002 003 ... <- conduction delay
// = 2 : 001 001 001 001 001 002 002 002 002 002 003 ...
// = 3 : 001 001 001 001 001 002 002 002 002 002 003 ...
// = 4 : 001 001 001 001 001 002 002 002 002 002 003 ...
// = 5 : 001 001 001 001 001 002 002 002 002 002 003 ...
// = 6 : 001 001 001 001 001 002 002 002 002 002 003 ...
// = 7 : 001 001 001 001 001 002 002 002 002 002 003 ...
// = 8 : 001 001 001 001 001 002 002 002 002 002 003 ...
// = 9 : 001 001 001 001 001 002 002 002 002 002 003 ...
// = 10 : 001 001 001 001 001 002 002 002 002 002 003 ...
// = ....
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
void PrintMatrixOfSynapticDelays() {
printf( " Matrix of Synaptic Delays\n\n" );
printf( " " );
for( int s = 0; s < NUM_SYNAPSES_PER_NEURON; ++s ) {
printf( " %8d ", s );
}
printf( "\n" );
printf( "-------" );
for( int s = 0; s < NUM_SYNAPSES_PER_NEURON; ++s ) {
printf( "----------" );
}
printf( " \n" );
for( int n = 0; n < NUM_TOTAL_NEURONS; ++n ) {
printf( "%3d : ", n );
for( int s = 0; s < NUM_SYNAPSES_PER_NEURON; ++s ) {
printf( " %03d ", GetDelayOfConnection( n, s ));
}
printf( "\n" );
}
printf( "Press enter ...\n" );
getchar();
}
#endif // __RUN_REFACTORED_VERSION__