/*--------------------------------------------------------------------------
Author: Christopher L Buckley and Thomas Nowotny
Institute: Centre for Computational Neuroscience and Robotics
University of Sussex
FcondNetworkmer, Brighton BN1 9QJ, UK
email to: c.l.buckley@sussex.ac.uk
version: 2009-11-02
--------------------------------------------------------------------------*/
using namespace std;
#include<cstdlib>
#include <sstream>
#include "CN_DCInput.h"
#include "CN_Rallsynapse.h"
#include "CN_absynapse.h"
#include "CN_rk65n.h"
#include "tnt.h"
#include <complex>
#include "jama_eig.h"
#include <vector>
#include <sys/time.h>
#include "gauss.h"
stdRG RG;
randomGauss RGaus;
#include "CN_Emptysynapse.h"
#include "CN_NeuronModel.cc"
#include "CN_absynapse.cc"
#include "CN_DCInput.cc"
#include "CN_Emptysynapse.cc"
#include "CN_rk65n.cc"
#include <iostream>
#include <fstream>
//Flags to set
bool doCond = false;
bool doPatterned = false;
int stimNum = 10000;
bool doRate = true;
bool backwardScale = true;
bool Manual = true;
bool CreateFile = true;
bool CaAdapt = false;
bool doneFileCreate = true;
//the parameters
double gm = 1.0;
double tauz = 0.02;
double betaGlobal = 0.005;
double Ic = 0.04132;
double minFreq = 0.008;
double maxFreq = 0.020;
double NoiseMag = 0.000;
//this are the parameter to gradually scale the weights over scaleTime ms in bins of length scaleBin
double scaleBin = 1;
double scaleTime = 5000;
double scaleStart2 = 6000;
double scaleTime2 = 8000;
double percentCritical = 0.85;
double INPUTMAG = 0.1;
int THETIME = 20000;
//int THETIME = 8000;
int IMPULSESTART = 8000;
//int IMPULSESTART = 2000;
double TURNOFFADAPT;
int IMPULSEDUR = 4000;
double OutTime;
//Manualy set
int NoFast = 0;
int NoInput =0;
int NoPNs = 20;
int NoORNs = 1;
int NoLNs = 20;
double ORN2LNWeight = 0.0006;
double ORN2PNWeight = 0.00055;
double LN2PNWeight = -30;
double LN2PNProb = 0.5;
double Pcon = 0.75;
double gSS = 1;
double gUU = 1;
double gSU = 1;// the stimulated nodes forward connections
double gUS = 1;
int NoTotal = NoPNs + NoLNs;
char *globalName;
#define NEUROSYNADAPT_PNO 19
#define NEUROSYNADAPT_IVARNO 8
#define NEUROSYN_PNO 19
Array1D<double> SeqArray;
double Seq;
double SeqMax;
bool SlowerAdapt = false;
//Flag to output data: Always true for single network run
bool OutDat = true;
bool Gradual;
//Linear fit of how the rest potential depends on the input current
double a;
double b;
double c;
//Linear fit to the F-I curve
double M;
double C;
//Ermentraoyt fit
double A;
double B;
double A2;
Array1D<double> vrestArray;
double PARAMS_LN[NEUROSYNADAPT_PNO] = { 7.15, // 0 - gNa: Na conductance in 1/(mOhms * cm^2)
50.0, // 1 - ENa: Na equi potential in mV
1.43, // 2 - gK: K conductance in 1/(mOhms * cm^2)
-95.0, // 3 - EK: K equi potential in mV
0.021, // 4 - gl: leak conductance in 1/(mOhms * cm^2)
-55.0, // 5 - El: leak equi potential in mV
0.00572, // 6 - gKl: potassium leakage conductivity
-95.0, // 7 - EKl: potassium leakage equi pot in mV
65.0, // 8 - V0: ~ total equi potential (?)
0.143, // 9 - Cmem: membr. capacity density in muF/cm^2
gm,//0.715, // 10 - gM: conductance of the M current
0.0, // 11- IDC: baseline offset current
-95, // 12 inEsyn %reversal potential (-95 = inhibitory)
-20, // 13 inEpre %threshold for pre synaptic spike detection
2, //14 inasyn
betaGlobal, // 15 inbsyn
1, // 16 inrtime
0, //17 noise
0 //Equilibrium Synspe value
};
double PARAMS_LNFAST[NEUROSYNADAPT_PNO] = { 7.15, // 0 - gNa: Na conductance in 1/(mOhms * cm^2)
50.0, // 1 - ENa: Na equi potential in mV
1.43, // 2 - gK: K conductance in 1/(mOhms * cm^2)
-95.0, // 3 - EK: K equi potential in mV
0.021, // 4 - gl: leak conductance in 1/(mOhms * cm^2)
-55.0, // 5 - El: leak equi potential in mV
0.00572, // 6 - gKl: potassium leakage conductivity
-95.0, // 7 - EKl: potassium leakage equi pot in mV
65.0, // 8 - V0: ~ total equi potential (?)
0.143, // 9 - Cmem: membr. capacity density in muF/cm^2
gm,//0.715, // 10 - gM: conductance of the M current
0.0, // 11- IDC: baseline offset current
-95, // 12 inEsyn %reversal potential (-95 = inhibitory)
-20, // 13 inEpre %threshold for pre synaptic spike detection
2, //14 inasyn
0.1, // 15 inbsyn
1, // 16 inrtime
0, //17 noise
0 //Equilibrium Synspe value
};
double PARAMS_PN[NEUROSYNADAPT_PNO] = { 7.15, // 0 - gNa: Na conductance in 1/(mOhms * cm^2)
50.0, // 1 - ENa: Na equi potential in mV
1.43, // 2 - gK: K conductance in 1/(mOhms * cm^2)
-95.0, // 3 - EK: K equi potential in mV
0.021, // 4 - gl: leak conductance in 1/(mOhms * cm^2)
-55.0, // 5 - El: leak equi potential in mV
0.00572, // 6 - gKl: potassium leakage conductivity
-95.0, // 7 - EKl: potassium leakage equi pot in mV
65.0, // 8 - V0: ~ total equi potential (?)
0.143, // 9 - Cmem: membr. capacity density in muF/cm^2
gm,//0.715, // 10 - gM: conductance of the M current
0.0, // 11- IDC: baseline offset current
0, // 12 inEsyn %reversal potential (-95 = inhibitory)
-20, // 13 inEpre %threshold for pre synaptic spike detection
2, //14 inasyn
betaGlobal, // 15 inbsyn
1, // 16 inrtime
0, //17 noise
0 //Equilibrium Synspe value
};
double PARAMS_ORN[NEUROSYNADAPT_PNO] = { 2, // 0 - spike time of mf_poisson inputneuron
10.0, // 1 - refractory period + spike time
-60.0, // 2 - input neuron resting potential
50.0, // 3 - input neuron potential when firing
0.0, // 4 - firing rate Lambda [1/ms]=[10^3 Hz]
2, //5 inasyn
0.01, // 6 inbsyn
1, // 7 inrtime
-55.0, // 8
0, // 9
0,//0.715, // 10
0.0, // 11-
0.0, // 12
0, // 13
0, //14
0, // 15
0, // 16
0, //17
0 //
};
const char *NEUROSYN_p_text[NEUROSYNADAPT_PNO] = {
"0 - gNa: Na conductance in 1/(mOhms * cm^2)",
"1 - ENa: Na equi potential in mV",
"2 - gK: K conductance in 1/(mOhms * cm^2)",
"3 - EK: K equi potential in mV",
"4 - gl: leak conductance in 1/(mOhms * cm^2)",
"5 - El: leak equi potential in mV",
"6 - gKl: potassium leakage conductivity",
"7 - EKl: potassium leakage equi pot in mV",
"8 - V0: ~ total equi potential (?)",
"9 - Cmem: membr. capacity density in muF/cm^2",
"10 - gM: conductance of the M current",
"11 - IDC: baseline offset current",
"12 - gKl: potassium leakage conductivity",
"13 - EKl: potassium leakage equi pot in mV",
"14 - V0: ~ total equi potential (?)",
"15 - Cmem: membr. capacity density in muF/cm^2",
"16 - gM: conductance of the M current",
"17 - IDC: baseline offset current"
"18 - eq valuet" };
double NEUROSYNADAPT_INIVARS[NEUROSYNADAPT_IVARNO] = { -60.0, // 0 - membrane potential E
0.0529324, // 1 - prob. for Na channel activation m
0.3176767, // 2 - prob. for not Na channel blocking h
0.5961207, // 3 - prob. for K channel activation n
0.1, // 4 - M current activation
0, // 5 - synapse activation
0.0, // 6 - calcium current
0.0 // 7 - that current
};
const char *NEUROSYN_INIVARSTEXT[NEUROSYNADAPT_IVARNO] = {
"0 - membrane potential E", "1 - prob. for Na channel activation m",
"2 - prob. for not Na channel blocking h",
"3 - prob. for K channel activation n", "4 - M current activation",
"5 - synapse activation", "6 - calcium" };
#include "CN_NeuroSynAdapt.h"
#include "CN_NeuroSynRate.h"
#include "CN_NeuroSynAdapt.cc"
#include "CN_NeuroSynRate.cc"
#include "CN_PoissonRateNeuron.h"
#include "CN_PoissonRateNeuron.cc"
#include "CN_Poissonneuron.h"
#include "CN_Poissonneuron.cc"
double rk65_MINDT = 0.05;
double rk65_eps = 1e-12;
double rk65_relEps = 1e-9;
double rk65_absEps = 1e-16;
double mindt = 1e-6;
#define EXTRAWRITE cerr << x[0] <<" "; n.currents(cerr,x);
#include "fullMGC.h"
#include "fullMGCRate.h"
int main(int argc, char *argv[]) {
//data output file
stringstream rname, cname;
ofstream rateEnd, memEnd;
rateEnd.precision(10);
memEnd.precision(10);
char thername[80];
char thecname[80];
if (tauz == 0.05 && gm == 1.0) {
//0.05{
A = 0.0848;
B = 13.1848;
a = -0.5678;
b = 5.8296;
c = -67.4830;
M = 0.0347;
C = 0.0114;
} else if (tauz == 0.02 && gm == 1.0) {
//0.02
A = 0.1224;
B = 21.1075;
a = -0.5967;
b = 5.2418;
c = -65.0945;
M = 0.0353;
C = 0.0043;
} else if (tauz == 0.01 && gm == 1.0) {
//0.01
A = 0.1672;
B = 24.0765;
a = -0.4664;
b = 4.4276;
c = -63.5274;
M = 0.0359;
C = 0.0015;
} else if (tauz == 0.01 && gm == 2.0) {
A = 0.0632;
B = 39.8488;
a = -0.4664;
b = 4.4276;
c = -63.5274;
M = 0.0185;
C = 0.0023;
}
A2 = pow(A, 2);
int seeder = 0;
if (Manual) {
if (argc != 23) {
cerr
<< "usage: filename percentCritical NoLNs NoPNs Pcon NoORNs gSS gUS gSU gUU minFreq maxFreq backwardScale docond ORN2LNWeight doneFileCreate LN2PNWeight ORN2PNWeight IMPULSEDUR stimNum IMPULSESTART seed"
<< endl;
exit(1);
}
cerr << "call was: ";
for (int i = 0; i < argc; i++) {
cerr << argv[i] << " ";
}
cerr << endl;
globalName = argv[1];
percentCritical = atof(argv[2]);
cout << "percentCritical: " << percentCritical << " ";
NoLNs = atoi(argv[3]);
cout << "NoLNs: " << NoLNs << " ";
NoPNs = atoi(argv[4]);
cout << "NoPNs: " << NoPNs << " ";
Pcon = atof(argv[5]);
stringstream name;
cout << "Pcon: " << Pcon << " ";
NoORNs = atoi(argv[6]);
cout << "NoORNs: " << NoORNs << " ";
gSS = (atof(argv[7]));
cout << "gSS: " << gSS << " ";
gUS = (atof(argv[8]));
cout << "gUS: " << gUS << " ";
gSU = (atof(argv[9]));
cout << "gSU: " << gSU << " ";
gUU = (atof(argv[10]));
cout << "gUU: " << gUU << " ";
minFreq = (atof(argv[11]));
cout << "minFreq: " << minFreq << " ";
maxFreq = (atof(argv[12]));
cout << "maxFreq: " << maxFreq << " ";
backwardScale = bool(atoi(argv[13]));
cout << "backwardScale: " << backwardScale << " ";
doCond = atoi(argv[14]);
cout << "doCond: " << doCond << " ";
ORN2LNWeight = (atof(argv[15]));
cout << "ORN2LNWeight: " << ORN2LNWeight << " ";
doneFileCreate = atoi(argv[16]);
cout << "doneFileCreate: " << doneFileCreate << " ";
LN2PNWeight = atof(argv[17]);
cout << "LN2PNWeight: " << LN2PNWeight << " ";
ORN2PNWeight = atof(argv[18]);
cout << "ORN2PNWeight: " << ORN2PNWeight << " ";
IMPULSEDUR = atoi(argv[19]);
cout << "IMPULSEDUR: " << IMPULSEDUR << " ";
stimNum = atoi(argv[20]);
cout << "stimNum: " << stimNum << " ";
IMPULSESTART = atoi(argv[21]);
cout << "IMPULSESTART: " << IMPULSESTART << " ";
seeder = atoi(argv[22]);
cout << "seed: " << seeder << " ";
RG.seed(seeder);
rname << argv[1] << "rate.dat";
cname << argv[1] << "cond.dat";
NoTotal = NoPNs + NoLNs;
} else {
seeder = int(RG.n() * 100);
//seeder=17;
RG.seed(seeder);
rname /*<< int(log(INPUTMAG)*100)*/<< "rate.dat";
cname /* << int(log(INPUTMAG)*100)*/<< "cond.dat";
}
LN2PNWeight = LN2PNWeight/(LN2PNProb*NoLNs);
ORN2PNWeight = ORN2PNWeight/NoORNs;
if(doCond)
Gradual = true;
else
Gradual = false;
if(Gradual)
{
THETIME = THETIME+scaleStart2+scaleTime2+2000;
IMPULSESTART = IMPULSESTART+scaleStart2+scaleTime2+2000;
TURNOFFADAPT = IMPULSESTART-5000;
}
OutTime = IMPULSESTART-4000;
rname >> thername;
cname >> thecname;
rateEnd.open(thername);
memEnd.open(thecname);
//Seed
//Set equilibrium postions
Array1D<double> SeqArrayInit(NoTotal, 0.0);
SeqArray = SeqArrayInit;
cout << " The synaptic eqm values are" << endl;
for (int i = 0; i < NoTotal; i++) {
if (i < NoFast) {
double alpha = PARAMS_LNFAST[14];
double beta = PARAMS_LNFAST[15];
double tr = PARAMS_LNFAST[16];
Seq = alpha * tr * minFreq / beta;
SeqMax = alpha * tr * maxFreq / beta;
}
if (i >= NoFast && i < NoLNs) {
double alpha = PARAMS_LN[14];
double beta = PARAMS_LN[15];
double tr = PARAMS_LN[16];
Seq = alpha * tr * minFreq / beta;
SeqMax = alpha * tr * maxFreq / beta;
}
if (i>=NoLNs)
{
double alpha = PARAMS_LN[14];
double beta = PARAMS_LN[15];
double tr = PARAMS_LN[16];
Seq = alpha * tr * minFreq / beta;
SeqMax = alpha * tr * maxFreq / beta;
}
SeqArray[i] = Seq + (SeqMax - Seq) * RG.n();
cout << SeqArray[i] << " ";
}
cout << endl;
//the networks
fullMGCRate NSRateNet;
fullMGC NSNet;
Array2D<double> weightsRate(NoTotal, NoTotal, 0.0);
Array2D<double> weightsCond(NoTotal, NoTotal, 0.0);
//set weights with eual incomign number
int NoCon = int(NoLNs * Pcon);
for (int i = 0; i < NoLNs; i++) {
weightsRate[i][i] = 0.0;
int counter = 0;
Array1D<double> holdInt(NoCon, 99999.0);
while (counter < NoCon) {
int tryInt = int(NoLNs * RG.n());
bool flag = true;
for (int j = 0; j < NoCon; j++) {
if (holdInt[j] == tryInt)
flag = false;
}
if (tryInt != i && flag) {
weightsRate[tryInt][i] = -1.0;
holdInt[counter] = tryInt;
counter++;
}
}
}
for (int i = 0; i < NoLNs; i++) {
for (int j = 0; j < NoLNs; j++) {
//stimulated node interconnections
if (j < NoORNs && i < NoORNs)
weightsRate[j][i] = weightsRate[j][i] * gSS;
// the stimulated nodes forward connections
if (j < NoORNs && i >= NoORNs)
weightsRate[j][i] = weightsRate[j][i] * gSU;
//unstimulated node interconnections
if (j >= NoORNs && i >= NoORNs)
weightsRate[j][i] = weightsRate[j][i] * gUU;
// the ustimulated nodes backward connections
if (j >= NoORNs && i <= NoORNs)
weightsRate[j][i] = weightsRate[j][i] * gUS;
if (i == j)
weightsRate[j][i] = 0.0;
}
}
for (int i = NoLNs; i < NoTotal; i++) {
for (int j = 0; j < NoLNs; j++) {
if (RG.n() < LN2PNProb)
weightsRate[j][i] = LN2PNWeight;
}
}
NSRateNet.SetWeights(weightsRate, SeqArray);
weightsCond = NSRateNet.SetCritical(percentCritical);
//for turning off the backward connections
if (!backwardScale) {
for (int i = 0; i < NoTotal; i++) {
for (int j = 0; j < NoTotal; j++) {
if (j < NoORNs && i >= NoORNs)
weightsCond[j][i] = weightsCond[j][i];
else
weightsCond[j][i] = 0.0;
}
}
}
Array1D<double> biasCond(NoTotal, 0.0);
NSRateNet.SetWeights(weightsCond, SeqArray);
biasCond = NSRateNet.SetCC();
NSNet.SetWeights(weightsCond, SeqArray);
NSNet.SetCC(biasCond);
NSRateNet.PrintWeights();
NSRateNet.PrintThetaValues();
NSRateNet.PrintMaxEig();
//trun on input at same time
Array1D<int> inputStart(NoORNs, 0);
for (int i = 0; i < NoORNs; i++)
inputStart[i] = 0;
Array1D<double> endPointsR(2 * NoTotal, 0.0);
Array1D<double> endPointsM(2 * NoTotal, 0.0);
if (doRate) {
NSRateNet.init();
endPointsR = NSRateNet.run(THETIME, INPUTMAG, inputStart);
}
rateEnd << INPUTMAG << " ";
for (int i = 0; i < 2 * NoTotal; i++)
rateEnd << endPointsR[i] << " ";
rateEnd << "\n";
rateEnd.close();
if (doCond) {
NSNet.init();
endPointsM = NSNet.run(THETIME, INPUTMAG, inputStart);
}
memEnd << INPUTMAG << " ";
for (int i = 0; i < 2 * NoTotal; i++)
memEnd << endPointsM[i] << " ";
memEnd << "\n";
memEnd.close();
cout << endl << "The random seed:" << seeder;
return 0;
}