Skip to content

Commit 2b29f45

Browse files
authored
Merge pull request #216 from FutureAIGuru/Mods-for-Video-Demos
Added pattern recognition demo
2 parents fa0ca17 + 5b8b7a7 commit 2b29f45

File tree

7 files changed

+10662
-96
lines changed

7 files changed

+10662
-96
lines changed

BrainSimulator/FiringHistoryWindow.xaml.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Windows.Media;
66
using System.Windows.Shapes;
77
using System.Windows.Threading;
8+
using System.Collections.Generic;
89
using System.Diagnostics;
910

1011
namespace BrainSimulator
@@ -86,9 +87,12 @@ private void ReallyDraw()
8687
StrokeLineJoin = PenLineJoin.Round,
8788
};
8889
pl.Points.Add(new Point(0, yPos0));
89-
// pc.Add(new Point(0, yPos0));
9090

9191
float lastValue = 0;
92+
93+
List<float> samples = new();
94+
for (int j = 0; j < FiringHistory.history[i].Samples.Count; j++)
95+
samples.Add(FiringHistory.history[i].Samples[j].value);
9296
for (int j = 0; j < FiringHistory.history[i].Samples.Count; j++)
9397
{
9498
double X = (FiringHistory.history[i].Samples[j].generation);
@@ -98,10 +102,11 @@ private void ReallyDraw()
98102
value1 = FiringHistory.history[i].Samples[j + 1].value;
99103
X -= minX;
100104
X *= xScale;
101-
if (value >= 1)
105+
if (value >= 1 )
102106
{
107+
//draw a spike
103108
double xDelta = xScale / 10;
104-
xDelta *= refractoryPeriod;
109+
xDelta *= refractoryPeriod-1;
105110
if (lastValue == 1) lastValue = 0;
106111
float yPosLastValue = (float)(yPos0 - lastValue * yDelta / 3);
107112
pl.Points.Add(new Point(X, yPosLastValue));
@@ -114,7 +119,7 @@ private void ReallyDraw()
114119
pl.Points.Add(new Point(X + 4.2 * xDelta, yPos3));
115120
pl.Points.Add(new Point(X + 6 * xDelta, yPos2));
116121
pl.Points.Add(new Point(X + 9 * xDelta, yPos0));
117-
j += refractoryPeriod-1;
122+
j += refractoryPeriod-2;
118123
//pc.Add(new Point(X, yPosLastValue));
119124
//pc.Add(new Point(X + xDelta, yPos1));
120125
//pc.Add(new Point(X + 2 * xDelta, yPos2));

BrainSimulator/Modules/ModuleCorticalColumn.cs

Lines changed: 69 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,17 @@ public override void Initialize()
5656
private void AddSynapses()
5757
{
5858
//rows with hard-coded functionality
59-
int inputRow = 6;
60-
int outputRow = 8;
61-
int thisCol = 9;
62-
int recur = 10;
63-
int isa = 11;
64-
int has_inst = 12;
65-
int has_a = 13;
66-
int part_of = 14;
59+
const int activateRow = 4;
60+
const int deActivateRo2 = 5;
61+
const int inputRow = 6;
62+
const int desOutRow = 7; //desired output
63+
const int outputRow = 8;
64+
const int thisCol = 9;
65+
const int recur = 10;
66+
const int isa = 11;
67+
const int has_inst = 12;
68+
const int has_a = 13;
69+
const int part_of = 14;
6770

6871
Init();
6972
//ClearNeurons(false);
@@ -72,74 +75,76 @@ private void AddSynapses()
7275
int colNum = 0;
7376
foreach (var module in theNeuronArray.modules)
7477
{
75-
if (module.Label=="CorticalColumn" && module.FirstNeuron < mv.FirstNeuron)
78+
if (module.Label == "CorticalColumn" && module.FirstNeuron < mv.FirstNeuron)
7679
colNum++;
7780
}
7881

79-
mv.GetNeuronAt(0, 0).Label = "Col" + colNum;
82+
mv.GetNeuronAt(0).Label = "Col" + colNum;
8083
Neuron n = theNeuronArray.GetNeuron("Request");
8184
if (n != null)
82-
n.AddSynapse(mv.GetNeuronAt(0, 0).id, 1);
85+
n.AddSynapse(mv.GetNeuronAt(0).id, 1);
8386

84-
mv.GetNeuronAt(0, 0).AddSynapse(mv.GetNeuronAt(0, 1).id, .2f, Synapse.modelType.Hebbian3);
85-
mv.GetNeuronAt(0, 0).AddSynapse(mv.GetNeuronAt(0, 2).id, 1);
86-
mv.GetNeuronAt(0, 1).Model = Neuron.modelType.LIF;
87-
mv.GetNeuronAt(0, 1).LeakRate = 0.3f;
88-
mv.GetNeuronAt(0, 1).AddSynapse(mv.GetNeuronAt(0, 2).id, -1);
89-
mv.GetNeuronAt(0, 1).AddSynapse(mv.GetNeuronAt(0, 3).id, -1);
90-
mv.GetNeuronAt(0, 2).AddSynapse(mv.GetNeuronAt(0, 3).id, 1);
91-
mv.GetNeuronAt(0, 3).AddSynapse(mv.GetNeuronAt(0, 4).id, 1);
87+
mv.GetNeuronAt(0).AddSynapse(mv.GetNeuronAt(0, 1).id, .2f, Synapse.modelType.Hebbian3);
88+
mv.GetNeuronAt(0).AddSynapse(mv.GetNeuronAt(0, 2).id, 1);
89+
mv.GetNeuronAt(1).Model = Neuron.modelType.LIF;
90+
mv.GetNeuronAt(1).LeakRate = 0.3f;
91+
mv.GetNeuronAt(1).AddSynapse(mv.GetNeuronAt(0, 2).id, -1);
92+
mv.GetNeuronAt(0, 1).AddSynapse(mv.GetNeuronAt(3).id, -1);
93+
mv.GetNeuronAt(0, 2).AddSynapse(mv.GetNeuronAt(3).id, 1);
94+
mv.GetNeuronAt(0, 3).AddSynapse(mv.GetNeuronAt(4).id, 1);
9295

9396
foreach (var module in theNeuronArray.modules)
9497
{
9598
if (module.ModuleTypeStr.Contains("CorticalColumn") && module.FirstNeuron > mv.FirstNeuron)
9699
{
97-
mv.GetNeuronAt(0, 3).AddSynapse(module.FirstNeuron + 4, -1);
100+
mv.GetNeuronAt(3).AddSynapse(module.FirstNeuron + 4, -1);
98101
}
99102
}
100103

101-
mv.GetNeuronAt(0, 4).Label = "Act" + colNum;
102-
mv.GetNeuronAt(0, 4).Model = Neuron.modelType.Burst;
103-
mv.GetNeuronAt(0, 4).AxonDelay = 7;
104-
mv.GetNeuronAt(0, 4).LeakRate = 4;
104+
mv.GetNeuronAt(4).Label = "Act" + colNum;
105+
mv.GetNeuronAt(4).Model = Neuron.modelType.Burst;
106+
mv.GetNeuronAt(4).AxonDelay = 7;
107+
mv.GetNeuronAt(4).LeakRate = 4;
105108

106-
mv.GetNeuronAt(0, 4).AddSynapse(mv.GetNeuronAt(0, 0).id, 1);
107-
mv.GetNeuronAt(0, 4).AddSynapse(mv.GetNeuronAt(0, 1).id, 1);
108-
mv.GetNeuronAt(0, 4).AddSynapse(mv.GetNeuronAt(0, 6).id, 1, Synapse.modelType.Learn);
109-
mv.GetNeuronAt(0, 4).AddSynapse(mv.GetNeuronAt(0, 7).id, 1, Synapse.modelType.Learn);
109+
mv.GetNeuronAt(4).AddSynapse(mv.GetNeuronAt(0).id, 1);
110+
mv.GetNeuronAt(4).AddSynapse(mv.GetNeuronAt(1).id, 1);
111+
mv.GetNeuronAt(4).AddSynapse(mv.GetNeuronAt(0, inputRow).id, 1, Synapse.modelType.Learn);
112+
mv.GetNeuronAt(4).AddSynapse(mv.GetNeuronAt(0, desOutRow).id, 1, Synapse.modelType.Learn);
110113

111114
mv.GetNeuronAt(5).Label = "De" + colNum;
112115
mv.GetNeuronAt(5).Model = Neuron.modelType.Burst;
113116
mv.GetNeuronAt(5).AxonDelay = 5;
114117
mv.GetNeuronAt(5).LeakRate = 4;
115118
mv.GetNeuronAt(5).AddSynapse(mv.GetNeuronAt(1).id, -1, Synapse.modelType.Learn);
116-
mv.GetNeuronAt(5).AddSynapse(mv.GetNeuronAt(6).id, -1, Synapse.modelType.Learn);
117-
mv.GetNeuronAt(5).AddSynapse(mv.GetNeuronAt(7).id, -1, Synapse.modelType.Learn);
118-
mv.GetNeuronAt(5).AddSynapse(mv.GetNeuronAt(8).id, -1, Synapse.modelType.Learn);
119-
120-
mv.GetNeuronAt(6).Label = "In" + colNum;
121-
mv.GetNeuronAt(6).Model = Neuron.modelType.LIF;
122-
mv.GetNeuronAt(6).LeakRate = .3f;
119+
mv.GetNeuronAt(5).AddSynapse(mv.GetNeuronAt(inputRow).id, -1, Synapse.modelType.Learn);
120+
mv.GetNeuronAt(5).AddSynapse(mv.GetNeuronAt(desOutRow).id, -1, Synapse.modelType.Learn);
121+
mv.GetNeuronAt(5).AddSynapse(mv.GetNeuronAt(outputRow).id, -1, Synapse.modelType.Learn);
122+
mv.GetNeuronAt(5).AddSynapse(mv.GetNeuronAt(part_of).id, -1, Synapse.modelType.Learn);
123+
124+
mv.GetNeuronAt(inputRow).Label = "In" + colNum;
125+
mv.GetNeuronAt(inputRow).Model = Neuron.modelType.LIF;
126+
mv.GetNeuronAt(inputRow).LeakRate = .3f;
123127
n = theNeuronArray.GetNeuron("in-fired");
124128
if (n != null)
125-
mv.GetNeuronAt(6).AddSynapse(n.id, 1);
129+
mv.GetNeuronAt(inputRow).AddSynapse(n.id, 1);
126130
for (int i = thisCol; i < part_of; i++)
127131
if (i != recur)
128132
mv.GetNeuronAt(inputRow).AddSynapse(mv.GetNeuronAt(i).id, 1);
129-
mv.GetNeuronAt(7).AddSynapse(mv.GetNeuronAt(recur).id, 1);
130-
mv.GetNeuronAt(8).AddSynapse(mv.GetNeuronAt(recur).id, 1);
131-
132-
mv.GetNeuronAt(7).Label = "In" + colNum+"*";
133-
mv.GetNeuronAt(7).Model = Neuron.modelType.LIF;
134-
mv.GetNeuronAt(7).LeakRate = .3f;
135-
mv.GetNeuronAt(7).AddSynapse(mv.GetNeuronAt(8).id, 1, Synapse.modelType.Learn);
136-
137-
mv.GetNeuronAt(8).Label = "Out" + colNum;
138-
mv.GetNeuronAt(8).Model = Neuron.modelType.LIF;
139-
mv.GetNeuronAt(8).LeakRate = .3f;
133+
134+
mv.GetNeuronAt(outputRow).AddSynapse(mv.GetNeuronAt(recur).id, 1);
135+
136+
mv.GetNeuronAt(desOutRow).Label = "In" + colNum + "*";
137+
mv.GetNeuronAt(desOutRow).Model = Neuron.modelType.LIF;
138+
mv.GetNeuronAt(desOutRow).LeakRate = .3f;
139+
//mv.GetNeuronAt(desOutRow).AddSynapse(mv.GetNeuronAt(outputRow).id, 1, Synapse.modelType.Learn);
140+
mv.GetNeuronAt(desOutRow).AddSynapse(mv.GetNeuronAt(part_of).id, 1, Synapse.modelType.Learn);
141+
142+
mv.GetNeuronAt(outputRow).Label = "Out" + colNum;
143+
mv.GetNeuronAt(outputRow).Model = Neuron.modelType.LIF;
144+
mv.GetNeuronAt(outputRow).LeakRate = .3f;
140145
n = theNeuronArray.GetNeuron("out-fired");
141146
if (n != null)
142-
mv.GetNeuronAt(8).AddSynapse(n.id, 1);
147+
mv.GetNeuronAt(outputRow).AddSynapse(n.id, 1);
143148

144149
//find all neurons in theNeuronArray with labels starting with "
145150
string labelPrefix = "\""; // Replace with desired prefix
@@ -149,26 +154,25 @@ private void AddSynapses()
149154
Neuron neuron = theNeuronArray.GetNeuron(i);
150155
if (neuron != null && neuron.Label != null && neuron.Label.StartsWith(labelPrefix))
151156
{
152-
neuron.AddSynapse(mv.GetNeuronAt(6).id, .2f, Synapse.modelType.Hebbian3);
153-
Neuron neuron2 = theNeuronArray.GetNeuron(i + 2*theNeuronArray.rows);
154-
neuron2.AddSynapse(mv.GetNeuronAt(7).id, .2f, Synapse.modelType.Hebbian3);
157+
neuron.AddSynapse(mv.GetNeuronAt(inputRow).id, .2f, Synapse.modelType.Hebbian3);
158+
Neuron neuron2 = theNeuronArray.GetNeuron(i + 2 * theNeuronArray.rows);
159+
neuron2.AddSynapse(mv.GetNeuronAt(desOutRow).id, .2f, Synapse.modelType.Hebbian3);
155160
Neuron neuron3 = theNeuronArray.GetNeuron(i + 4 * theNeuronArray.rows);
156-
mv.GetNeuronAt(8).AddSynapse(neuron3.id, .2f, Synapse.modelType.Hebbian3);
161+
mv.GetNeuronAt(outputRow).AddSynapse(neuron3.id, .2f, Synapse.modelType.Hebbian3);
157162
}
158163
}
159164

160-
161165
//this relationship...transfer input to output
162166
Neuron nThis = theNeuronArray.GetNeuron("this");
163167
if (nThis == null) return;
164168
nThis.AddSynapse(mv.GetNeuronAt(thisCol).id, 1, Synapse.modelType.Gate);
165-
mv.GetNeuronAt(thisCol).AddSynapse(mv.GetNeuronAt(8).id, 1);
169+
mv.GetNeuronAt(thisCol).AddSynapse(mv.GetNeuronAt(outputRow).id, 1);
166170

167171
//recur relationship...transfer output to input
168172
Neuron nRecur = theNeuronArray.GetNeuron("recur");
169173
if (nRecur == null) return;
170174
nRecur.AddSynapse(mv.GetNeuronAt(recur).id, 1, Synapse.modelType.Gate);
171-
mv.GetNeuronAt(recur).AddSynapse(mv.GetNeuronAt(6).id, 1);
175+
mv.GetNeuronAt(recur).AddSynapse(mv.GetNeuronAt(inputRow).id, 1);
172176

173177
//Isa Relationships
174178
bool flowControl = AddFixedRelationshipRow(outputRow, has_inst, "has-inst");
@@ -177,7 +181,7 @@ private void AddSynapses()
177181
flowControl = AddFixedRelationshipRow(outputRow, has_a, "has-a");
178182
if (!flowControl)
179183
return;
180-
flowControl = AddFixedRelationshipRow(outputRow, isa, "is-a");
184+
flowControl = AddFixedRelationshipRow(outputRow, isa, "is-a");
181185
if (!flowControl)
182186
return;
183187

@@ -186,13 +190,18 @@ private void AddSynapses()
186190
if (nSource is null) return;
187191
nSource.AddSynapse(mv.GetNeuronAt(part_of).id, 1, Synapse.modelType.Gate);
188192
mv.GetNeuronAt(part_of).AddSynapse(mv.GetNeuronAt(outputRow).id, 1);
189-
193+
mv.GetNeuronAt(part_of).Model = Neuron.modelType.LIF;
194+
mv.GetNeuronAt(part_of).LeakRate = 0.005f;
195+
mv.GetNeuronAt(part_of).Label = "Rec"+colNum;
196+
197+
190198
foreach (var module in theNeuronArray.modules)
191199
{
192-
if (module.Label== "CorticalColumn" && module.FirstNeuron != mv.FirstNeuron)
200+
if (module.Label == "CorticalColumn" && module.FirstNeuron != mv.FirstNeuron)
193201
{
194-
Neuron nTest = module.GetNeuronAt(inputRow);
195-
nTest.AddSynapse(mv.GetNeuronAt(part_of).id,.2f, Synapse.modelType.Hebbian2);
202+
Neuron nInput = module.GetNeuronAt(inputRow);
203+
nInput.AddSynapse(mv.GetNeuronAt(part_of).id, 0, Synapse.modelType.Hebbian2);
204+
mv.GetNeuronAt(part_of).AddSynapse(module.GetNeuronAt(part_of).id, -1); //add mutual suppression
196205
}
197206
}
198207
}

0 commit comments

Comments
 (0)