Beispiel #1
0
        private void ReallyDraw()
        {
            theCanvas.Children.Clear();
            theCanvas2.Children.Clear();
            long maxX = MainWindow.theNeuronArray.Generation;
            long minX = FiringHistory.EarliestValue();

            if (minX <= maxX) //any samples?
            {
                Point  windowSize = new Point(theCanvas.ActualWidth, theCanvas.ActualHeight);
                double xScale     = windowSize.X / (maxX - minX);
                double yDelta     = windowSize.Y / (FiringHistory.history.Count + 1);

                for (int i = 0; i < FiringHistory.history.Count; i++)
                {
                    double yPos0 = yDelta * (i + 1);
                    double yPos1 = yPos0 - yDelta / 2;
                    double yPos2 = yPos0 + yDelta / 10;

                    Polyline pl = new Polyline()
                    {
                        Stroke           = new SolidColorBrush(Colors.Black),
                        StrokeThickness  = 4,
                        StrokeEndLineCap = PenLineCap.Round,
                    };
                    pl.Points.Add(new Point(0, yPos0));

                    for (int j = 0; j < FiringHistory.history[i].Samples.Count; j++)
                    {
                        double X = (FiringHistory.history[i].Samples[j]);
                        X -= minX;
                        X *= xScale;
                        pl.Points.Add(new Point(X, yPos0));
                        pl.Points.Add(new Point(X + xScale / 6, yPos1));
                        pl.Points.Add(new Point(X + xScale / 5, yPos1));
                        pl.Points.Add(new Point(X + xScale / 4, yPos2));
                        pl.Points.Add(new Point(X + xScale / 2, yPos0));
                    }

                    pl.Points.Add(new Point(theCanvas.Width, yPos0));
                    theCanvas.Children.Add(pl);
                    string label = "#" + FiringHistory.history[i].NeuronID.ToString();
                    if (MainWindow.theNeuronArray.GetNeuron(FiringHistory.history[i].NeuronID).Label != "")
                    {
                        label = MainWindow.theNeuronArray.GetNeuron(FiringHistory.history[i].NeuronID).Label;
                    }

                    Label l = new Label
                    {
                        Content    = label,
                        Foreground = new SolidColorBrush(Colors.White)
                    };
                    l.MouseMove         += L_MouseMove;
                    l.MouseLeftButtonUp += L_MouseLeftButtonUp;
                    Canvas.SetLeft(l, 10);
                    Canvas.SetTop(l, yPos1);
                    theCanvas2.Children.Add(l);
                }
            }
        }
Beispiel #2
0
        private void btnDialogOk_Click(object sender, RoutedEventArgs e)
        {
            int.TryParse(txtColumns.Text, out int newCols);
            int.TryParse(txtRows.Text, out int newRows);
            int oldCols = MainWindow.theNeuronArray.arraySize / MainWindow.theNeuronArray.rows;
            int oldRows = MainWindow.theNeuronArray.rows;

            if (newCols < oldCols || newRows < oldRows)
            {
                MessageBox.Show("Can only make neuron array bigger.");
                return;
            }
            if (newCols != oldCols || newRows != oldRows)
            {
                MainWindow.arrayView.ClearSelection();
                SelectionRectangle rr = new SelectionRectangle(0, oldCols, oldRows);
                MainWindow.arrayView.theSelection.selectedRectangles.Add(rr);
                MainWindow.arrayView.CopyNeurons();
                MainWindow.arrayView.ClearSelection();
                MainWindow.theNeuronArray = new NeuronArray();
                MainWindow.theNeuronArray.Initialize(newRows * newCols, newRows);
                MainWindow.theNeuronArray.rows         = newRows;
                MainWindow.arrayView.targetNeuronIndex = 0;
                MainWindow.arrayView.PasteNeurons();
                MainWindow.theNeuronArray.ShowSynapses = true;
                MainWindow.thisWindow.SetShowSynapsesCheckBox(true);
                MainWindow.arrayView.ClearShowingSynapses();
                FiringHistory.ClearAll();
                MainWindow.CloseHistoryWindow();
            }
            this.Close();
        }
Beispiel #3
0
 private void Clear_Click(object sender, RoutedEventArgs e)
 {
     FiringHistory.Clear();
     wheelScale      = 0;
     theCanvas.Width = scroller.ActualWidth;
     scroller.ScrollToRightEnd();
     ReallyDraw();
 }
Beispiel #4
0
 public static void CloseHistoryWindow()
 {
     if (fwWindow != null)
     {
         fwWindow.Close();
     }
     FiringHistory.Clear();
 }
Beispiel #5
0
        public void MoveOneNeuron(Neuron n, Neuron nNewLocation)
        {
            n.AddUndoInfo();
            nNewLocation.AddUndoInfo();

            //copy the neuron attributes and delete them from the old neuron.
            n.Copy(nNewLocation);
            MainWindow.theNeuronArray.SetCompleteNeuron(nNewLocation);
            if (FiringHistory.NeuronIsInFiringHistory(n.id))
            {
                FiringHistory.RemoveNeuronFromHistoryWindow(n.id);
                FiringHistory.AddNeuronToHistoryWindow(nNewLocation.id);
            }

            //for all the synapses going out this neuron, change to going from new location
            //don't use a foreach here because the body of the loop may delete a list entry
            for (int k = 0; k < n.Synapses.Count; k++)
            {
                Synapse s = n.Synapses[k];
                if (s.targetNeuron != n.id)
                {
                    nNewLocation.AddSynapseWithUndo(s.targetNeuron, s.weight, s.model);
                }
                else
                {
                    nNewLocation.AddSynapseWithUndo(nNewLocation.id, s.weight, s.model);
                }
                n.DeleteSynapseWithUndo(n.synapses[k].targetNeuron);
            }

            //for all the synapses coming into this neuron, change the synapse target to new location
            for (int k = 0; k < n.SynapsesFrom.Count; k++)
            {
                Synapse reverseSynapse = n.SynapsesFrom[k]; //(from synapses are sort-of backward
                if (reverseSynapse.targetNeuron != -1)      //?
                {
                    Neuron sourceNeuron = MainWindow.theNeuronArray.GetNeuron(reverseSynapse.targetNeuron);
                    sourceNeuron.DeleteSynapseWithUndo(n.id);
                    if (sourceNeuron.id != n.id)
                    {
                        sourceNeuron.AddSynapseWithUndo(nNewLocation.id, reverseSynapse.weight, reverseSynapse.model);
                    }
                }
            }

            n.Clear();
        }
Beispiel #6
0
        private static void SetValueInSelectedNeurons(Neuron n, string property)
        {
            bool neuronInSelection = NeuronInSelection(n.id);

            if (neuronInSelection)
            {
                List <int> theNeurons = theNeuronArrayView.theSelection.EnumSelectedNeurons();
                //special case for label because they are auto-incremented,
                //clear all the labels first to avoid collisions
                if (property == "label")
                {
                    for (int i = 0; i < theNeurons.Count; i++)
                    {
                        Neuron n1 = MainWindow.theNeuronArray.GetNeuron(theNeurons[i]);
                        if (n1.id != n.id)
                        {
                            n1.label = "";
                            n1.Update();
                        }
                    }
                }
                for (int i = 0; i < theNeurons.Count; i++)
                {
                    Neuron n1 = MainWindow.theNeuronArray.GetNeuron(theNeurons[i]);
                    n1.AddUndoInfo();
                    switch (property)
                    {
                    case "currentCharge":
                        if (n.model == Neuron.modelType.Color)
                        {
                            n1.SetValueInt(n.LastChargeInt);
                        }
                        else
                        {
                            n1.currentCharge = n.currentCharge;
                            n1.lastCharge    = n.currentCharge;
                        }
                        break;

                    case "leakRate": n1.leakRate = n.leakRate; break;

                    case "axonDelay": n1.axonDelay = n.axonDelay; break;

                    case "model": n1.model = n.model; break;

                    case "enable": n1.leakRate = n.leakRate; break;

                    case "history":
                        if (FiringHistory.NeuronIsInFiringHistory(n.id))
                        {
                            FiringHistory.AddNeuronToHistoryWindow(n1.id);
                            OpenHistoryWindow();
                        }
                        else
                        {
                            FiringHistory.RemoveNeuronFromHistoryWindow(n1.id);
                        }
                        break;

                    case "synapses":
                        if (MainWindow.arrayView.IsShowingSnapses(n.id))
                        {
                            MainWindow.arrayView.AddShowSynapses(n1.id);
                        }
                        else
                        {
                            MainWindow.arrayView.RemoveShowSynapses(n1.id);
                        }
                        break;

                    case "label":
                        if (n.label == "")
                        {
                            n1.label = "";
                        }
                        else if (n.id != n1.id)
                        {
                            string newLabel = n.label;
                            while (MainWindow.theNeuronArray.GetNeuron(newLabel) != null)
                            {
                                int num        = 0;
                                int digitCount = 0;
                                while (Char.IsDigit(newLabel[newLabel.Length - 1]))
                                {
                                    int.TryParse(newLabel[newLabel.Length - 1].ToString(), out int digit);
                                    num = num + (int)Math.Pow(10, digitCount) * digit;
                                    digitCount++;
                                    newLabel = newLabel.Substring(0, newLabel.Length - 1);
                                }
                                num++;
                                newLabel = newLabel + num.ToString();
                            }
                            n1.label = newLabel;
                        }
                        break;
                    }
                    n1.Update();
                }
            }
        }
Beispiel #7
0
        private static void Cm_Closed(object sender, RoutedEventArgs e)
        {
            if (sender is ContextMenu cm)
            {
                if (!cm.IsOpen)
                {
                    return;
                }
                cm.IsOpen = false;
                if (cmCancelled)
                {
                    MainWindow.Update();
                    return;
                }
                MainWindow.theNeuronArray.SetUndoPoint();
                int    neuronID = (int)cm.GetValue(NeuronIDProperty);
                Neuron n        = MainWindow.theNeuronArray.GetNeuron(neuronID);
                n.AddUndoInfo();

                bool    applyToAll = false;
                Control cc         = Utils.FindByName(cm, "ApplyToSelection");
                if (cc is CheckBox cb)
                {
                    if (cb.IsChecked == true)
                    {
                        applyToAll = true;
                    }
                }

                cc = Utils.FindByName(cm, "Label");
                if (cc is TextBox tb)
                {
                    string newLabel = tb.Text;
                    if (int.TryParse(newLabel, out int dummy))
                    {
                        newLabel = "_" + newLabel;
                    }
                    if (labelChanged)
                    {
                        MainWindow.theNeuronArray.SetUndoPoint();
                        n.Label = newLabel;
                        if (applyToAll)
                        {
                            SetValueInSelectedNeurons(n, "label");
                        }
                    }
                }
                cc = Utils.FindByName(cm, "Model");
                if (cc is ComboBox cb0)
                {
                    ListBoxItem      lbi = (ListBoxItem)cb0.SelectedItem;
                    Neuron.modelType nm  = (Neuron.modelType)System.Enum.Parse(typeof(Neuron.modelType), lbi.Content.ToString());
                    if (modelChanged)
                    {
                        n.model = nm;
                        if (applyToAll)
                        {
                            SetValueInSelectedNeurons(n, "model");
                        }
                    }
                }
                cc = Utils.FindByName(cm, "CurrentCharge");
                if (cc is ComboBox tb1)
                {
                    if (n.model == Neuron.modelType.Color)
                    {
                        try
                        {
                            uint newCharge = Convert.ToUInt32(tb1.Text, 16);
                            if (chargeChanged)
                            {
                                n.SetValueInt((int)newCharge);
                                n.lastCharge = newCharge;
                                if (applyToAll)
                                {
                                    SetValueInSelectedNeurons(n, "currentCharge");
                                }
                                Utils.AddToValues(newCharge, colorValues);
                            }
                        }
                        catch { };
                    }
                    else
                    {
                        float.TryParse(tb1.Text, out float newCharge);
                        if (chargeChanged)
                        {
                            n.SetValue(newCharge);
                            n.lastCharge = newCharge;
                            if (applyToAll)
                            {
                                SetValueInSelectedNeurons(n, "currentCharge");
                            }
                            Utils.AddToValues(newCharge, currentChargeValues);
                        }
                    }
                }
                cc = Utils.FindByName(cm, "LeakRate");
                if (cc is ComboBox tb2)
                {
                    float.TryParse(tb2.Text, out float leakRate);
                    if (leakRateChanged)
                    {
                        n.LeakRate = leakRate;
                        if (applyToAll)
                        {
                            SetValueInSelectedNeurons(n, "leakRate");
                        }
                        if (n.model == Neuron.modelType.LIF)
                        {
                            Utils.AddToValues(leakRate, leakRateValues);
                        }
                        if (n.model == Neuron.modelType.Random)
                        {
                            Utils.AddToValues(leakRate, stdDevValues);
                        }
                        if (n.model == Neuron.modelType.Burst)
                        {
                            Utils.AddToValues(leakRate, axonDelayValues);
                        }
                    }
                }
                else
                {
                    n.leakRate = 0;
                }
                cc = Utils.FindByName(cm, "AxonDelay");
                if (cc is ComboBox tb3)
                {
                    int.TryParse(tb3.Text, out int axonDelay);
                    if (axonDelayChanged)
                    {
                        n.axonDelay = axonDelay;
                        if (applyToAll)
                        {
                            SetValueInSelectedNeurons(n, "axonDelay");
                        }
                        if (n.model == Neuron.modelType.Random)
                        {
                            Utils.AddToValues(axonDelay, meanValues);
                        }
                        else if (n.model == Neuron.modelType.Always)
                        {
                            Utils.AddToValues(axonDelay, alwaysDelayValues);
                        }
                        else if (n.model == Neuron.modelType.Burst)
                        {
                            Utils.AddToValues(axonDelay, alwaysDelayValues);
                        }
                        else
                        {
                            Utils.AddToValues(axonDelay, axonDelayValues);
                        }
                    }
                }
                cc = Utils.FindByName(cm, "Synapses");
                if (cc is CheckBox cb2)
                {
                    if (synapsesChanged)
                    {
                        if (cb2.IsChecked == true)
                        {
                            MainWindow.arrayView.AddShowSynapses(n.id);
                        }
                        else
                        {
                            MainWindow.arrayView.RemoveShowSynapses(n.id);
                        }
                        if (applyToAll)
                        {
                            SetValueInSelectedNeurons(n, "synapses");
                        }
                    }
                }

                cc = Utils.FindByName(cm, "Enabled");
                if (cc is CheckBox cb1)
                {
                    if (enabledChanged)
                    {
                        if (cb1.IsChecked == true)
                        {
                            n.leakRate = Math.Abs(n.leakRate);
                        }
                        else
                        {
                            n.leakRate = Math.Abs(n.leakRate) * -1.0f;
                        }

                        if (applyToAll)
                        {
                            SetValueInSelectedNeurons(n, "enable");
                        }
                    }
                }

                cc = Utils.FindByName(cm, "History");
                if (cc is CheckBox cb3)
                {
                    if (historyChanged)
                    {
                        if (cb3.IsChecked == true)
                        {
                            FiringHistory.AddNeuronToHistoryWindow(n.id);
                            OpenHistoryWindow();
                        }
                        else
                        {
                            FiringHistory.RemoveNeuronFromHistoryWindow(n.id);
                        }
                        if (applyToAll)
                        {
                            SetValueInSelectedNeurons(n, "history");
                        }
                    }
                }
                n.Update();
            }
            MainWindow.Update();
        }
Beispiel #8
0
        public static void CreateContextMenu(int i, Neuron n, ContextMenu cm)
        {
            cmCancelled = false;

            labelChanged     = false;
            modelChanged     = false;
            enabledChanged   = false;
            historyChanged   = false;
            synapsesChanged  = false;
            chargeChanged    = false;
            leakRateChanged  = false;
            axonDelayChanged = false;

            n = MainWindow.theNeuronArray.AddSynapses(n);
            cm.SetValue(NeuronIDProperty, n.Id);
            cm.Closed         += Cm_Closed;
            cm.Opened         += Cm_Opened;
            cm.PreviewKeyDown += Cm_PreviewKeyDown;
            cmCancelled        = false;
            cm.StaysOpen       = true;

            //The neuron label
            StackPanel sp = new StackPanel {
                Orientation = Orientation.Horizontal, Margin = new Thickness(0, 3, 3, 3)
            };

            sp.Children.Add(new Label {
                Content = "ID: " + n.id + "   Label: ", VerticalAlignment = VerticalAlignment.Center, Padding = new Thickness(0)
            });
            TextBox tb = Utils.ContextMenuTextBox(n.Label, "Label", 150);

            tb.TextChanged += Tb_TextChanged;
            sp.Children.Add(tb);
            sp.Children.Add(new Label {
                Content = "Warning:\rDuplicate Label", FontSize = 8, Name = "DupWarn", Visibility = Visibility.Hidden
            });
            //            cm.Items.Add(sp);
            //MenuItem mi = new MenuItem { StaysOpenOnClick = true, Header = new TextBox { Text = "Harry" } };
            cm.Items.Add(new MenuItem {
                StaysOpenOnClick = true, Header = sp
            });

            //The neuron model
            sp = new StackPanel {
                Orientation = Orientation.Horizontal, Margin = new Thickness(0, 3, 3, 3)
            };
            sp.Children.Add(new Label {
                Content = "Model: ", Padding = new Thickness(0)
            });
            ComboBox cb = new ComboBox()
            {
                Width = 100, Name = "Model"
            };

            for (int index = 0; index < Enum.GetValues(typeof(Neuron.modelType)).Length; index++)
            {
                Neuron.modelType model = (Neuron.modelType)index;
                cb.Items.Add(new ListBoxItem()
                {
                    Content = model.ToString(),
                    ToolTip = Neuron.modelToolTip[index],
                    Width   = 100,
                });
            }
            cb.SelectedIndex     = (int)n.Model;
            cb.SelectionChanged += Cb_SelectionChanged;
            sp.Children.Add(cb);
            cm.Items.Add(new MenuItem {
                StaysOpenOnClick = true, Header = sp
            });

            cm.Items.Add(new Separator());

            MenuItem mi             = new MenuItem();
            CheckBox cbShowSynapses = new CheckBox
            {
                IsChecked = (n.leakRate > 0) || float.IsPositiveInfinity(1.0f / n.leakRate),
                Content   = "Enabled",
                Name      = "Enabled",
            };

            cbShowSynapses.Checked   += CbCheckedChanged;
            cbShowSynapses.Unchecked += CbCheckedChanged;
            cm.Items.Add(new MenuItem {
                StaysOpenOnClick = true, Header = cbShowSynapses
            });

            cbShowSynapses = new CheckBox
            {
                IsChecked = MainWindow.arrayView.IsShowingSnapses(n.id),
                Content   = "Show Synapses",
                Name      = "Synapses",
            };
            cbShowSynapses.Checked   += CbCheckedChanged;
            cbShowSynapses.Unchecked += CbCheckedChanged;
            cm.Items.Add(new MenuItem {
                StaysOpenOnClick = true, Header = cbShowSynapses
            });

            mi = new MenuItem();
            CheckBox cbHistory = new CheckBox
            {
                IsChecked = FiringHistory.NeuronIsInFiringHistory(n.id),
                Content   = "Record Firing History",
                Name      = "History",
            };

            cbHistory.Checked   += CbCheckedChanged;
            cbHistory.Unchecked += CbCheckedChanged;
            cm.Items.Add(new MenuItem {
                StaysOpenOnClick = true, Header = cbHistory
            });

            mi        = new MenuItem();
            mi.Header = "Synapses Out";
            foreach (Synapse s in n.Synapses)
            {
                string   targetLabel     = MainWindow.theNeuronArray.GetNeuron(s.targetNeuron).Label;
                MenuItem synapseMenuItem = new MenuItem()
                {
                    Header = s.targetNeuron.ToString().PadLeft(8) + s.Weight.ToString("F3").PadLeft(9) + " " + targetLabel, FontFamily = new FontFamily("Courier New")
                };
                synapseMenuItem.Click += Mi_Click;
                synapseMenuItem.PreviewMouseRightButtonDown += SynapseMenuItem_PreviewMouseRightButtonDown;
                synapseMenuItem.ToolTip = "L-click -> target neuron, R-Click -> edit synapse";
                mi.Items.Add(synapseMenuItem);
            }
            cm.Items.Add(mi);

            mi        = new MenuItem();
            mi.Header = "Synapses In";
            foreach (Synapse s in n.SynapsesFrom)
            {
                string   targetLabel     = MainWindow.theNeuronArray.GetNeuron(s.targetNeuron).Label;
                MenuItem synapseMenuItem = new MenuItem()
                {
                    Header = s.targetNeuron.ToString().PadLeft(8) + " " + s.Weight.ToString("F3").PadLeft(9) + " " + targetLabel, FontFamily = new FontFamily("Courier New")
                };
                synapseMenuItem.Click += Mi_Click;
                synapseMenuItem.PreviewMouseRightButtonDown += SynapseFromMenuItem_PreviewMouseRightButtonDown1;
                synapseMenuItem.ToolTip = "L-click -> source neuron, R-Click -> edit synapse";
                mi.Items.Add(synapseMenuItem);;
            }
            cm.Items.Add(mi);

            mi = new MenuItem {
                Header = "Paste Here"
            };
            if (MainWindow.myClipBoard == null)
            {
                mi.IsEnabled = false;
            }
            mi.Click += Mi_Click;
            cm.Items.Add(mi);
            mi = new MenuItem {
                Header = "Move Here"
            };
            if (MainWindow.arrayView.theSelection.selectedRectangles.Count == 0)
            {
                mi.IsEnabled = false;
            }
            mi.Click += Mi_Click;
            cm.Items.Add(mi);


            mi        = new MenuItem();
            mi.Header = "Connect Multiple Synapses";
            mi.Click += Mi_Click;
            mi.Items.Add(new MenuItem()
            {
                Header = "From Selection to Here"
            });
            ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click;
            mi.Items.Add(new MenuItem()
            {
                Header = "From Here to Selection"
            });
            ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click;
            mi.Items.Add(new MenuItem()
            {
                Header = "Mutual Suppression"
            });
            ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click;
            cm.Items.Add(mi);

            if (NeuronInSelection(n.id))
            {
                cbShowSynapses = new CheckBox
                {
                    IsChecked = true,
                    Content   = "Apply changes to all neurons in selection",
                    Name      = "ApplyToSelection",
                };
                cbShowSynapses.Checked   += CbCheckedChanged;
                cbShowSynapses.Unchecked += CbCheckedChanged;
                cm.Items.Add(new MenuItem {
                    StaysOpenOnClick = true, Header = cbShowSynapses
                });
            }


            sp = new StackPanel {
                Orientation = Orientation.Horizontal
            };
            Button b0 = new Button {
                Content = "OK", Width = 100, Height = 25, Margin = new Thickness(10)
            };

            b0.Click += B0_Click;
            sp.Children.Add(b0);
            b0 = new Button {
                Content = "Cancel", Width = 100, Height = 25, Margin = new Thickness(10)
            };
            b0.Click += B0_Click;
            sp.Children.Add(b0);

            cm.Items.Add(new MenuItem {
                Header = sp, StaysOpenOnClick = true
            });

            SetCustomCMItems(cm, n, n.model);
        }
Beispiel #9
0
        private void ReallyDraw()
        {
            refractoryPeriod = MainWindow.theNeuronArray.RefractoryDelay;
            refractoryPeriod++;
            theCanvas.Children.Clear();
            theCanvas2.Children.Clear();
            long maxX = MainWindow.theNeuronArray.Generation;
            long minX = FiringHistory.EarliestValue();

            if (minX <= maxX) //any samples?
            {
                long sampleCount = maxX - minX;
                if (sampleCount > 100 && wheelScale == 0)
                {
                    theCanvas.Width = scroller.ActualWidth * (float)sampleCount / 100f;
                    scroller.ScrollToRightEnd();
                }
                Point  windowSize = new Point(theCanvas.Width, theCanvas.ActualHeight);
                double xScale     = windowSize.X / (float)sampleCount;
                double yDelta     = .9 * windowSize.Y / (FiringHistory.history.Count);
                yDelta = Math.Min(yDelta, 200);

                //TODO:  The commented-out lines will create a smooth curve instead of the line approximation
                for (int i = 0; i < FiringHistory.history.Count; i++)
                {
                    double yPos0  = yDelta * (i + 1);
                    double yPos1  = yPos0 - yDelta * .85;
                    double yPos15 = yPos0 - yDelta * .875;
                    double yPos2  = yPos0 + yDelta / 20;
                    double yPos3  = yPos0 + yDelta / 10;
                    //PointCollection pc = new PointCollection();

                    Polyline pl = new Polyline()
                    {
                        Stroke           = new SolidColorBrush(Colors.Black),
                        StrokeThickness  = 4,
                        StrokeEndLineCap = PenLineCap.Round,
                        StrokeLineJoin   = PenLineJoin.Round,
                    };
                    pl.Points.Add(new Point(0, yPos0));
                    //                    pc.Add(new Point(0, yPos0));

                    float lastValue = 0;
                    for (int j = 0; j < FiringHistory.history[i].Samples.Count; j++)
                    {
                        double X      = (FiringHistory.history[i].Samples[j].generation);
                        float  value  = FiringHistory.history[i].Samples[j].value;
                        float  value1 = value;
                        if (j < FiringHistory.history[i].Samples.Count - 1)
                        {
                            value1 = FiringHistory.history[i].Samples[j + 1].value;
                        }
                        X -= minX;
                        X *= xScale;
                        if (value >= 1)
                        {
                            double xDelta = xScale / 10;
                            xDelta *= refractoryPeriod;
                            if (lastValue == 1)
                            {
                                lastValue = 0;
                            }
                            float yPosLastValue = (float)(yPos0 - lastValue * yDelta / 3);
                            pl.Points.Add(new Point(X, yPosLastValue));
                            pl.Points.Add(new Point(X + xDelta, yPos1));
                            pl.Points.Add(new Point(X + 1.1 * xDelta, yPos15));
                            pl.Points.Add(new Point(X + 1.2 * xDelta, yPos1));
                            pl.Points.Add(new Point(X + 2.2 * xDelta, yPos0));
                            pl.Points.Add(new Point(X + 2.5 * xDelta, yPos2));
                            pl.Points.Add(new Point(X + 3.5 * xDelta, yPos3));
                            pl.Points.Add(new Point(X + 4.2 * xDelta, yPos3));
                            pl.Points.Add(new Point(X + 6 * xDelta, yPos2));
                            pl.Points.Add(new Point(X + 9 * xDelta, yPos0));
                            j += refractoryPeriod - 1;
                            //pc.Add(new Point(X, yPosLastValue));
                            //pc.Add(new Point(X + xDelta, yPos1));
                            //pc.Add(new Point(X + 2 * xDelta, yPos2));
                            //pc.Add(new Point(X + 3 * xDelta, yPos2));
                            //pc.Add(new Point(X + 5 * xDelta, yPos3));
                            //pc.Add(new Point(X + 9 * xDelta, yPos0));
                        }
                        else
                        {
                            float yPosValue = (float)(yPos0 - value * yDelta / 3);
                            pl.Points.Add(new Point(X, yPosValue));
                            if (value1 >= value)
                            {
                                pl.Points.Add(new Point(X + xScale * 9 / 10, yPosValue));
                            }
                            //pc.Add(new Point(X, yPosValue));
                        }
                        lastValue = value;
                    }

                    //pl.Points.Add(new Point(theCanvas.Width, yPos0));
                    //pc.Add(new Point(theCanvas.Width, yPos0));

                    //PolyBezierSegment pbs = new PolyBezierSegment { Points = pc };
                    //PathSegmentCollection psc = new PathSegmentCollection { pbs };
                    //PathFigure pf = new PathFigure { StartPoint = new Point(0, yPos0), Segments = psc };
                    //PathFigureCollection pfc = new PathFigureCollection { pf };
                    //PathGeometry pg = new PathGeometry { Figures = pfc };
                    //Path thePath = new Path { Stroke = Brushes.Green, StrokeThickness = 2, Data = pg };


                    theCanvas.Children.Add(pl);
                    //theCanvas.Children.Add(thePath);
                    string label = "#" + FiringHistory.history[i].NeuronID.ToString();
                    if (MainWindow.theNeuronArray.GetNeuron(FiringHistory.history[i].NeuronID).Label != "")
                    {
                        label = MainWindow.theNeuronArray.GetNeuron(FiringHistory.history[i].NeuronID).Label;
                    }

                    Label l = new Label
                    {
                        Content    = label,
                        Foreground = new SolidColorBrush(Colors.White),
                        FontSize   = yDelta / 3
                    };
                    l.MouseMove         += L_MouseMove;
                    l.MouseLeftButtonUp += L_MouseLeftButtonUp;
                    Canvas.SetLeft(l, 10);
                    Canvas.SetTop(l, yPos1);
                    theCanvas2.Children.Add(l);
                    theCanvas.Children.Add(new Line
                    {
                        X1              = 0,
                        X2              = theCanvas.Width,
                        Y1              = yPos0,
                        Y2              = yPos0,
                        Stroke          = Brushes.Green,
                        StrokeDashArray = new DoubleCollection {
                            3, 5
                        },
                        StrokeThickness = 2,
                    });
                    theCanvas.Children.Add(new Line
                    {
                        X1              = 0,
                        X2              = theCanvas.Width,
                        Y1              = yPos0 - yDelta / 3,
                        Y2              = yPos0 - yDelta / 3,
                        Stroke          = Brushes.Red,
                        StrokeDashArray = new DoubleCollection {
                            3, 5
                        },
                        StrokeThickness = 2,
                    });
                }
            }
        }
Beispiel #10
0
 private static void Cm_Closed(object sender, RoutedEventArgs e)
 {
     if ((Keyboard.GetKeyStates(Key.Escape) & KeyStates.Down) > 0)
     {
         return;
     }
     if (cmCancelled)
     {
         cmCancelled = false;
         return;
     }
     if (sender is ContextMenu cm)
     {
         int     neuronID = (int)cm.GetValue(NeuronIDProperty);
         Neuron  n        = MainWindow.theNeuronArray.GetNeuron(neuronID);
         Control cc       = Utils.FindByName(cm, "Label");
         if (cc is TextBox tb)
         {
             n.Label = tb.Text;
         }
         cc = Utils.FindByName(cm, "CurrentCharge");
         if (cc is TextBox tb1)
         {
             float.TryParse(tb1.Text, out float newCharge);
             n.SetValue(newCharge);
         }
         cc = Utils.FindByName(cm, "LeakRate");
         if (cc is TextBox tb2)
         {
             float.TryParse(tb2.Text, out float leakRate);
             if (n.LeakRate != leakRate)
             {
                 n.LeakRate = leakRate;
                 SetModelAndLeakrate(n);
             }
             n.LeakRate = leakRate;
         }
         cc = Utils.FindByName(cm, "History");
         if (cc is CheckBox cb1)
         {
             bool KeepHistory = (bool)cb1.IsChecked;
             if (!KeepHistory)
             {
                 FiringHistory.RemoveNeuronFromHistoryWindow(n.Id);
                 if (FiringHistory.history.Count == 0 && MainWindow.fwWindow != null && MainWindow.fwWindow.IsVisible)
                 {
                     MainWindow.fwWindow.Close();
                     MainWindow.fwWindow = null;
                 }
             }
             else  //make sure a window is open
             {
                 FiringHistory.AddNeuronToHistoryWindow(n.id);
                 OpenHistoryWindow();
             }
             //if there is a selection, set all the keepHistory values to match
             bool neuronInSelection = false;
             foreach (NeuronSelectionRectangle sr in theNeuronArrayView.theSelection.selectedRectangles)
             {
                 if (sr.NeuronIsInSelection(neuronID))
                 {
                     neuronInSelection = true;
                     break;
                 }
             }
             if (neuronInSelection)
             {
                 theNeuronArrayView.theSelection.EnumSelectedNeurons();
                 for (Neuron n1 = theNeuronArrayView.theSelection.GetSelectedNeuron(); n1 != null; n1 = theNeuronArrayView.theSelection.GetSelectedNeuron())
                 {
                     if (KeepHistory)
                     {
                         FiringHistory.AddNeuronToHistoryWindow(n1.id);
                     }
                     else
                     {
                         FiringHistory.RemoveNeuronFromHistoryWindow(n1.id);
                     }
                 }
                 //n1.KeepHistory = (bool)cb1.IsChecked;
             }
         }
     }
     MainWindow.Update();
 }
Beispiel #11
0
        public static void CreateContextMenu(int i, Neuron n, ContextMenu cm)
        {
            n = MainWindow.theNeuronArray.AddSynapses(n);
            cm.SetValue(NeuronIDProperty, n.Id);
            cm.Closed  += Cm_Closed;
            cmCancelled = false;
            StackPanel sp = new StackPanel {
                Orientation = Orientation.Horizontal, Margin = new Thickness(0, 3, 3, 3)
            };

            sp.Children.Add(new Label {
                Content = "Charge: ", Padding = new Thickness(0)
            });
            if (n.Model == Neuron.modelType.FloatValue)
            {
                sp.Children.Add(new TextBox {
                    Text = n.CurrentCharge.ToString("f2"), Width = 60, Name = "CurrentCharge", VerticalAlignment = VerticalAlignment.Center
                });
            }
            else if (n.model == Neuron.modelType.Color)
            {
                sp.Children.Add(new TextBox {
                    Text = n.LastChargeInt.ToString("X"), Width = 60, Name = "CurrentCharge", VerticalAlignment = VerticalAlignment.Center
                });
            }
            else
            {
                sp.Children.Add(new TextBox {
                    Text = n.LastCharge.ToString("f2"), Width = 60, Name = "CurrentCharge", VerticalAlignment = VerticalAlignment.Center
                });
            }
            cm.Items.Add(sp);
            if (n.Model == Neuron.modelType.LIF || n.model == Neuron.modelType.Random)
            {
                sp = new StackPanel {
                    Orientation = Orientation.Horizontal, Margin = new Thickness(0, 3, 3, 3)
                };
                sp.Children.Add(new Label {
                    Content = "Leak Rate: ", Padding = new Thickness(0)
                });
                sp.Children.Add(new TextBox {
                    Text = n.LeakRate.ToString("f4"), Width = 60, Name = "LeakRate", VerticalAlignment = VerticalAlignment.Center
                });
                cm.Items.Add(sp);
            }

            MenuItem mi = new MenuItem();

            mi.Header = "Neuron ID: " + n.Id;
            cm.Items.Add(mi);
            cm.Items.Add(new Separator());
            mi        = new MenuItem();
            mi.Header = "Always Fire";
            mi.Click += Mi_Click;
            cm.Items.Add(mi);
            mi        = new MenuItem();
            mi.Header = "Paste Here";
            mi.Click += Mi_Click;
            cm.Items.Add(mi);
            mi        = new MenuItem();
            mi.Header = "Clipboard";
            mi.Click += Mi_Click;
            mi.Items.Add(new MenuItem()
            {
                Header = "Paste Here"
            });
            ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click;
            mi.Items.Add(new MenuItem()
            {
                Header = "Move Here"
            });
            ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click;
            mi.Items.Add(new MenuItem()
            {
                Header = "Connect to Here"
            });
            ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click;
            mi.Items.Add(new MenuItem()
            {
                Header = "Connect from Here"
            });
            ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click;
            mi.Items.Add(new MenuItem()
            {
                Header = "Select as Target"
            });
            ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click;
            cm.Items.Add(mi);
            sp = new StackPanel {
                Orientation = Orientation.Horizontal, Margin = new Thickness(0, 3, 3, 3)
            };
            sp.Children.Add(new Label {
                Content = "Label: ", Padding = new Thickness(0)
            });
            sp.Children.Add(new TextBox {
                Text = n.Label, Width = 150, Name = "Label", VerticalAlignment = VerticalAlignment.Center
            });
            cm.Items.Add(sp);

            sp = new StackPanel {
                Orientation = Orientation.Horizontal, Margin = new Thickness(0, 3, 3, 3)
            };
            sp.Children.Add(new Label {
                Content = "Model: ", Padding = new Thickness(0)
            });
            ComboBox cb = new ComboBox()
            {
                Width = 100
            };

            for (int index = 0; index < Enum.GetValues(typeof(Neuron.modelType)).Length; index++)
            {
                Neuron.modelType model = (Neuron.modelType)index;
                cb.Items.Add(new ListBoxItem()
                {
                    Content = model.ToString(),
                    ToolTip = Neuron.modelToolTip[index],
                    Width   = 100,
                });
            }
            cb.SelectedIndex     = (int)n.Model;
            cb.SelectionChanged += Cb_SelectionChanged;
            sp.Children.Add(cb);
            cm.Items.Add(sp);
            CheckBox cbHistory = new CheckBox
            {
                IsChecked = FiringHistory.NeuronIsInFiringHistory(n.id),
                Content   = "Record Firing History",
                Name      = "History",
            };

            cbHistory.Checked   += CbHistory_Checked;
            cbHistory.Unchecked += CbHistory_Checked;
            cm.Items.Add(cbHistory);

            mi        = new MenuItem();
            mi.Header = "Synapses";
            foreach (Synapse s in n.Synapses)
            {
                string   targetLabel     = MainWindow.theNeuronArray.GetNeuron(s.targetNeuron).Label;
                MenuItem synapseMenuItem = new MenuItem()
                {
                    Header = s.targetNeuron.ToString().PadLeft(8) + s.Weight.ToString("F3").PadLeft(9) + " " + targetLabel, FontFamily = new FontFamily("Courier New")
                };
                synapseMenuItem.Click += Mi_Click;
                synapseMenuItem.PreviewMouseRightButtonDown += SynapseMenuItem_PreviewMouseRightButtonDown;
                synapseMenuItem.ToolTip = "L-click -> target neuron, R-Click -> edit synapse";
                mi.Items.Add(synapseMenuItem);
            }
            cm.Items.Add(mi);

            mi        = new MenuItem();
            mi.Header = "Synapses In";
            foreach (Synapse s in n.SynapsesFrom)
            {
                string   targetLabel     = MainWindow.theNeuronArray.GetNeuron(s.targetNeuron).Label;
                MenuItem synapseMenuItem = new MenuItem()
                {
                    Header = s.targetNeuron.ToString().PadLeft(8) + " " + s.Weight.ToString("F3").PadLeft(9) + " " + targetLabel, FontFamily = new FontFamily("Courier New")
                };
                synapseMenuItem.Click += Mi_Click;
                synapseMenuItem.PreviewMouseRightButtonDown += SynapseFromMenuItem_PreviewMouseRightButtonDown1;
                synapseMenuItem.ToolTip = "L-click -> source neuron, R-Click -> edit synapse";
                mi.Items.Add(synapseMenuItem);;
            }
            cm.Items.Add(mi);
        }
        public static ContextMenu CreateContextMenu(int i, Neuron n, ContextMenu cm)
        {
            cmCancelled = false;

            labelChanged     = false;
            toolTipChanged   = false;
            modelChanged     = false;
            enabledChanged   = false;
            historyChanged   = false;
            synapsesChanged  = false;
            chargeChanged    = false;
            leakRateChanged  = false;
            axonDelayChanged = false;

            n = MainWindow.theNeuronArray.AddSynapses(n);
            cm.SetValue(NeuronIDProperty, n.Id);
            cm.Closed         += Cm_Closed;
            cm.Opened         += Cm_Opened;
            cm.PreviewKeyDown += Cm_PreviewKeyDown;
            cmCancelled        = false;
            cm.StaysOpen       = true;
            cm.Width           = 300;

            //The neuron label
            MenuItem mi1 = new MenuItem {
                Header = "ID: " + n.id, Padding = new Thickness(0)
            };

            cm.Items.Add(mi1);

            //apply to all in selection
            CheckBox cbApplyToSelection = new CheckBox
            {
                IsChecked = true,
                Content   = "Apply changes to all neurons in selection",
                Name      = "ApplyToSelection",
            };

            cbApplyToSelection.Checked   += CbCheckedChanged;
            cbApplyToSelection.Unchecked += CbCheckedChanged;
            cm.Items.Add(new MenuItem {
                StaysOpenOnClick = true, Header = cbApplyToSelection
            });
            if (MainWindow.arrayView.theSelection.selectedRectangles.Count > 0)
            {
                cbApplyToSelection.IsEnabled = true;
                cbApplyToSelection.IsChecked = NeuronInSelection(n.id);
            }
            else
            {
                cbApplyToSelection.IsChecked = false;
                cbApplyToSelection.IsEnabled = false;
            }

            //label
            StackPanel sp = new StackPanel {
                Orientation = Orientation.Horizontal,
            };

            sp.Children.Add(new Label {
                Content = "Label: ", Padding = new Thickness(0), VerticalAlignment = VerticalAlignment.Center,
            });;
            TextBox tb = Utils.ContextMenuTextBox(n.Label, "Label", 170);

            tb.TextChanged += Tb_TextChanged;
            sp.Children.Add(tb);
            sp.Children.Add(new Label {
                Content = "Warning: Duplicate Label", FontSize = 8, Name = "DupWarn", Visibility = Visibility.Hidden
            });
            mi1 = new MenuItem {
                StaysOpenOnClick = true, Header = sp
            };
            cm.Items.Add(mi1);

            //tooltip
            if (n.Label != "" || n.ToolTip != "") //add the tooltip textbox if needed
            {
                sp = new StackPanel {
                    Orientation = Orientation.Horizontal
                };
                sp.Children.Add(new Label {
                    Content = "Tooltip: ", VerticalAlignment = VerticalAlignment.Center, Padding = new Thickness(0)
                });
                tb              = Utils.ContextMenuTextBox(n.ToolTip, "ToolTip", 150);
                tb.TextChanged += Tb_TextChanged;
                sp.Children.Add(tb);
                cm.Items.Add(sp);
            }

            //The neuron model
            sp = new StackPanel {
                Orientation = Orientation.Horizontal, Margin = new Thickness(0, 3, 3, 3)
            };
            sp.Children.Add(new Label {
                Content = "Model: ", Padding = new Thickness(0)
            });
            ComboBox cb = new ComboBox()
            {
                Width = 80, Name = "Model"
            };

            for (int index = 0; index < Enum.GetValues(typeof(Neuron.modelType)).Length; index++)
            {
                Neuron.modelType model = (Neuron.modelType)index;
                cb.Items.Add(new ListBoxItem()
                {
                    Content = model.ToString(),
                    ToolTip = Neuron.modelToolTip[index],
                    Width   = 100,
                });
            }
            cb.SelectedIndex     = (int)n.Model;
            cb.SelectionChanged += Cb_SelectionChanged;
            sp.Children.Add(cb);
            cm.Items.Add(new MenuItem {
                StaysOpenOnClick = true, Header = sp
            });

            cm.Items.Add(new Separator {
                Visibility = Visibility.Collapsed
            });
            cm.Items.Add(new Separator {
                Visibility = Visibility.Collapsed
            });


            MenuItem mi             = new MenuItem();
            CheckBox cbEnableNeuron = new CheckBox
            {
                IsChecked = (n.leakRate > 0) || float.IsPositiveInfinity(1.0f / n.leakRate),
                Content   = "Enabled",
                Name      = "Enabled",
            };

            cbEnableNeuron.Checked   += CbCheckedChanged;
            cbEnableNeuron.Unchecked += CbCheckedChanged;
            cm.Items.Add(new MenuItem {
                StaysOpenOnClick = true, Header = cbEnableNeuron
            });

            CheckBox cbShowSynapses = new CheckBox
            {
                IsChecked = MainWindow.arrayView.IsShowingSynapses(n.id),
                Content   = "Show Synapses",
                Name      = "Synapses",
            };

            cbShowSynapses.Checked   += CbCheckedChanged;
            cbShowSynapses.Unchecked += CbCheckedChanged;
            cm.Items.Add(new MenuItem {
                StaysOpenOnClick = true, Header = cbShowSynapses
            });

            mi = new MenuItem();
            CheckBox cbHistory = new CheckBox
            {
                IsChecked = FiringHistory.NeuronIsInFiringHistory(n.id),
                Content   = "Record Firing History",
                Name      = "History",
            };

            cbHistory.Checked   += CbCheckedChanged;
            cbHistory.Unchecked += CbCheckedChanged;
            cm.Items.Add(new MenuItem {
                StaysOpenOnClick = true, Header = cbHistory
            });

            mi = new MenuItem {
                Header = "Clear Synapses"
            };
            mi.Click += Mi_Click;
            cm.Items.Add(mi);

            cm.Items.Add(new Separator());
            cm.Items.Add(new Separator());

            mi        = new MenuItem();
            mi.Header = "Synapses Out";
            mi.Width  = 250;
            mi.HorizontalAlignment = HorizontalAlignment.Left;
            foreach (Synapse s in n.Synapses)
            {
                AddSynapseEntryToMenu(mi, s);
            }
            cm.Items.Add(mi);

            mi        = new MenuItem();
            mi.Header = "Synapses In";
            mi.Width  = 250;
            mi.HorizontalAlignment = HorizontalAlignment.Left;
            foreach (Synapse s in n.SynapsesFrom)
            {
                AddSynapseEntryToMenu(mi, s);
            }
            cm.Items.Add(mi);

            mi = new MenuItem {
                Header = "Paste Here"
            };
            if (!XmlFile.WindowsClipboardContainsNeuronArray())
            {
                mi.IsEnabled = false;
            }
            mi.Click += Mi_Click;
            cm.Items.Add(mi);

            mi = new MenuItem {
                Header = "Move Here"
            };
            if (MainWindow.arrayView.theSelection.selectedRectangles.Count == 0)
            {
                mi.IsEnabled = false;
            }
            mi.Click += Mi_Click;
            cm.Items.Add(mi);


            mi        = new MenuItem();
            mi.Header = "Connect Multiple Synapses";
            mi.Width  = 250;
            mi.HorizontalAlignment = HorizontalAlignment.Left;
            mi.Click += Mi_Click;
            mi.Items.Add(new MenuItem()
            {
                Header = "From Selection to Here"
            });
            ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click;
            mi.Items.Add(new MenuItem()
            {
                Header = "From Here to Selection"
            });
            ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click;
            mi.Items.Add(new MenuItem()
            {
                Header = "Mutual Suppression"
            });
            ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click;
            cm.Items.Add(mi);

            sp = new StackPanel {
                Orientation = Orientation.Horizontal
            };
            Button b0 = new Button {
                Content = "OK", Width = 100, Height = 25, Margin = new Thickness(10)
            };

            b0.Click += B0_Click;
            sp.Children.Add(b0);
            b0 = new Button {
                Content = "Cancel", Width = 100, Height = 25, Margin = new Thickness(10)
            };
            b0.Click += B0_Click;
            sp.Children.Add(b0);

            cm.Items.Add(new MenuItem {
                Header = sp, StaysOpenOnClick = true
            });

            SetCustomCMItems(cm, n, n.model);

            return(cm);
        }