/// <summary> /// Saves the current topology in the GUI. /// </summary> private void SaveTopology(object sender, EventArgs e) { NetworkTopology topology = new NetworkTopology(); topology.MetaData = topologyMetaData; List <IHiddenLayer> hiddenLayers = new List <IHiddenLayer>(); foreach (UserControl layer in topologyDisplay.Controls) { Type layerType = layer.GetType(); Dictionary <string, string> metaData = ((LayerView)layer).GetMetaData(); if (layerType == typeof(InputLayerView)) { InputLayerShell inputLayer = new InputLayerShell(); inputLayer.MetaData = metaData; topology.InputLayer = inputLayer; } else if (layerType == typeof(HiddenLayerView)) { HiddenLayerView view = (HiddenLayerView)layer; LayerView[] rawNodes = view.GetNodes(); INode[] nodes = new INode[rawNodes.Length]; for (int i = 0; i < rawNodes.Length; i++) { NodeShell node = new NodeShell(); node.MetaData = rawNodes[i].GetMetaData(); nodes[i] = node; } HiddenLayerShell hiddenLayer = new HiddenLayerShell(); hiddenLayer.MetaData = metaData; hiddenLayer.Nodes = nodes; hiddenLayers.Add(hiddenLayer); } else if (layerType == typeof(OutputLayerView)) { OutputLayerShell outputLayer = new OutputLayerShell(); outputLayer.MetaData = metaData; topology.OutputLayer = outputLayer; } else if (layerType == typeof(PreProcessorView)) { PreProcessorShell preProcessor = new PreProcessorShell(); preProcessor.MetaData = metaData; topology.PreProcessor = preProcessor; } else if (layerType == typeof(PostProcessorView)) { PostProcessorShell postProcessor = new PostProcessorShell(); postProcessor.MetaData = metaData; topology.PostProcessor = postProcessor; } topology.HiddenLayers = hiddenLayers.ToArray(); saveTopology.ShowDialog(); if (saveTopology.FileName.EndsWith(".nntc")) { saveTopology.FileName.Remove(saveTopology.FileName.Length - 1); } Topology.Save(saveTopology.FileName, topology); } }
/// <summary> /// Checks the current topology to see if it can be saved. /// </summary> private void UpdateSaveStatus() { if (!hasInput || !hasOutput || !hasPreProcessor || !hasPostProcessor) { canSave = false; topologyStatus.Items["canSaveStatus"].Text = "Can Save: False"; return; } if (topologyDisplay.Controls.Count < 5) { canSave = false; topologyStatus.Items["canSaveStatus"].Text = "Can Save: False"; return; } HiddenLayerView current; HiddenLayerView prior = null; List <string> layerNames = new List <string>(); for (int i = 2; i < topologyDisplay.Controls.Count - 2; i++) { current = (HiddenLayerView)topologyDisplay.Controls[i]; //Check to make sure the layer has a name if (!current.GetMetaData().ContainsKey("layerName")) { canSave = false; topologyStatus.Items["canSaveStatus"].Text = "Can Save: False"; return; } //Check to make sure that the name is unique if (layerNames.Contains(current.GetMetaData()["layerName"])) { canSave = false; topologyStatus.Items["canSaveStatus"].Text = "Can Save: False"; return; } layerNames.Add(current.GetMetaData()["layerName"]); //Check that the layer has nodes added to it. if (current.GetNodes().Length == 0) { canSave = false; topologyStatus.Items["canSaveStatus"].Text = "Can Save: False"; return; } int weightCount = 0; if (prior == null) { weightCount = ((InputLayerView)topologyDisplay.Controls[1]).GetInputCount(); } else { weightCount = prior.GetNodes().Length; } foreach (LayerView node in current.GetNodes()) { //Check to make sure that the combination weights are set if (!node.GetMetaData().ContainsKey("combinationWeights")) { canSave = false; topologyStatus.Items["canSaveStatus"].Text = "Can Save: False"; return; } //Check to make sure that there are enough weights specified if (weightCount > node.GetMetaData()["combinationWeights"].Split(',').Length) { canSave = false; topologyStatus.Items["canSaveStatus"].Text = "Can Save: False"; return; } } prior = current; } canSave = true; topologyStatus.Items["canSaveStatus"].Text = "Can Save: True"; }