private MNCDContext InitCtx(string databaseName)
        {
            var options = new DbContextOptionsBuilder <MNCDContext>()
                          .UseInMemoryDatabase(databaseName)
                          .Options;
            var ctx = new MNCDContext(options);

            ctx.DataSets.RemoveRange(ctx.DataSets);
            ctx.SaveChanges();
            var edgeList = "0 0 1 0 1";
            var dataSet  = new NetworkDataSet
            {
                Content    = edgeList,
                FileType   = FileType.EdgeList,
                EdgeList   = edgeList,
                Name       = "Data set 1",
                Hash       = _hasher.GetHashFor(edgeList),
                ActorNames = new List <string> {
                    "A0", "A1"
                },
                EdgeCount  = 1,
                LayerCount = 1,
                LayerNames = new List <string> {
                    "L1"
                },
                NodeCount = 2,
            };

            ctx.DataSets.Add(dataSet);
            ctx.SaveChanges();
            return(new MNCDContext(options));
        }
        /// <summary>
        /// Выбрать файл для тестирования.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Btn_ChooseTestingFile_Click(object sender, EventArgs e)
        {
            try
            {
                using (var openFileDialog = new OpenFileDialog())
                {
                    openFileDialog.Filter = "Excel Files|*.xls;*.xlsx;*.xlsm";
                    openFileDialog.InitialDirectory = CommonUtils.ResourcesDirectory;

                    if (openFileDialog.ShowDialog() == DialogResult.OK)
                    {
                        using (new CursorHandler())
                        {
                            var excelFilePath = Path.Combine(CommonUtils.ResourcesDirectory, openFileDialog.FileName);
                            tbTestingFile.Text = excelFilePath;

                            var dataTable = _reader.ReadFromFile(excelFilePath);
                            _testingDataSet = _converter.Convert(dataTable);

                            _interfaceMediator.DrawDataIntoGrid(_testingDataSet.Entities, _neuralNetwork.InputAttributes, dgvTesingData);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
 public static Network ReadDataSet(NetworkDataSet dataSet)
 {
     return(dataSet.FileType switch
     {
         FileType.MPX => new MpxReader().FromString(dataSet.Content),
         FileType.EdgeList => new EdgeListReader().FromString(dataSet.Content),
         _ => throw new ApplicationException("Unsupported file type."),
     });
        /// <summary>
        /// Загрузить данные из файла для обучения сети.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Btn_ChooseLearningFile_Click(object sender, EventArgs e)
        {
            try
            {
                using (var openFileDialog = new OpenFileDialog())
                {
                    openFileDialog.Filter = "Excel Files|*.xls;*.xlsx;*.xlsm";
                    openFileDialog.InitialDirectory = CommonUtils.ResourcesDirectory;

                    if (openFileDialog.ShowDialog() == DialogResult.OK)
                    {
                        using (new CursorHandler())
                        {
                            var excelFilePath = Path.Combine(CommonUtils.ResourcesDirectory, openFileDialog.FileName);
                            tbLearningFile.Text = excelFilePath;

                            var learningDataTable = _reader.ReadFromFile(excelFilePath);

                            _learningDataSet = _converter.Convert(learningDataTable);
                            _neuralNetwork.InputAttributes = _learningDataSet.Attributes
                                .Select(a => new InputAttributeBase
                                {
                                    InputAttributeNumber = a.OrderNumber,
                                    Name = a.Name
                                })
                                .ToList();

                            _interfaceMediator.DrawDataIntoGrid(_learningDataSet.Entities, _neuralNetwork.InputAttributes, dgvInputLearningData);
							
							RecalcMinMaxValues(_learningDataSet);
							RecalcMinMaxValues(_testingDataSet);

							var normalizedData = _learningDataSet.Entities
                                .Select(l => new NetworkDataEntity()
                                {
                                    Name = l.Name,
                                    OrderNumber = l.OrderNumber,
                                    AttributeValues = l.AttributeValues.Select(a => new NetworkEntityAttributeValue
                                    {
                                        Attribute = a.Attribute,
                                        Value = a.GetNormalizedValue(_neuralNetwork.NormalizationType)
                                    }).ToList()
                                })
                                .ToList();
                            _interfaceMediator.DrawDataIntoGrid(normalizedData, _neuralNetwork.InputAttributes, dgvNormalizedLearningData);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        private async Task <Visualization> GetVisualizationFromDataSet(
            NetworkDataSet dataSet,
            VisualizationType type)
        {
            if (type == VisualizationType.MultiLayer_Diagonal)
            {
                var diagonal = dataSet.Visualizations
                               .FirstOrDefault(v => v.Type == VisualizationType.MultiLayer_Diagonal);

                if (diagonal is null)
                {
                    var request = new MultilayerRequest
                    {
                        EdgeList = dataSet.EdgeList,
                        Type     = VisualizationType.MultiLayer_Diagonal
                    };
                    diagonal = await VisualizeMultilayer(request);

                    dataSet.Visualizations.Add(diagonal);
                    await _ctx.SaveChangesAsync();
                }

                return(diagonal);
            }
            else if (type == VisualizationType.MultiLayer_Slices)
            {
                var slices = dataSet.Visualizations
                             .FirstOrDefault(v => v.Type == VisualizationType.MultiLayer_Slices);

                if (slices is null)
                {
                    var request = new MultilayerRequest
                    {
                        EdgeList = dataSet.EdgeList,
                        Type     = VisualizationType.MultiLayer_Slices
                    };
                    slices = await VisualizeMultilayer(request);

                    dataSet.Visualizations.Add(slices);
                    await _ctx.SaveChangesAsync();
                }

                return(slices);
            }

            throw new NotSupportedException($"Visualization type '{type}' is not supported for datasets.");
        }
		/// <summary>
		/// Пересчитать минимальное и максимальое значение.
		/// </summary>
		/// <param name="dataSet">Данные.</param>
		private void RecalcMinMaxValues(NetworkDataSet dataSet)
		{
			if (!(dataSet?.Attributes?.Any() ?? false))
			{
				return;
			}

			foreach (var attribute in dataSet.Attributes)
			{
				attribute.Max = dataSet.Entities
					.Max(e => e.AttributeValues.First(a => a.Attribute.OrderNumber == attribute.OrderNumber).Value);
				attribute.Min = dataSet.Entities
					.Min(e => e.AttributeValues.First(a => a.Attribute.OrderNumber == attribute.OrderNumber).Value);
				dataSet.Entities
					.ForEach(entity => entity.AttributeValues.First(a => a.Attribute.OrderNumber == attribute.OrderNumber).Attribute = attribute);
			}
		}
        /// <summary>
        /// Изменить кластер - повторная кластеризация.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Btn_EditCluster_Click(object sender, EventArgs e)
        {
            try
            {
                var isEdit = _networkBase?.NetworkId > 0;
                if (!isEdit)
                {
                    throw new Exception("Невозможно изменить кластер у несохраненной нейронной сети.");
                }
                if (tvClusters.SelectedNode?.Tag == null || string.IsNullOrEmpty(tvClusters.SelectedNode.Tag.ToString()))
                {
                    throw new Exception("Выберите кластер для изменения.");
                }

                var cluster = tvClusters.SelectedNode.Tag as NetworkCluster;
                var neuron = _neuralNetwork.Neurons.First(n => n.NeuronNumber == cluster.Number);
                if (neuron.NeuronId <= 0)
                {
                    throw new Exception("Невозможно изменить кластер у несохраненной нейронной сети.");
                }

                var dataSet = new NetworkDataSet()
                {
                    Entities = _testingDataSet.Entities
                        .Where(t => cluster.Entities.Select(c => c.OrderNumber).Contains(t.OrderNumber))
                        .ToList(),
                    Attributes = _testingDataSet.Attributes
                };
                var mainForm = IoC.Instance.Resolve<MainForm>(
                    new IoC.NinjectArgument("networkId", cluster.NetworkId),
                    new IoC.NinjectArgument("parentNeuronId", neuron.NeuronId),
                    new IoC.NinjectArgument("parentNeuronDataSet", dataSet.Clone() as NetworkDataSet));
                if (mainForm.ShowDialog() == DialogResult.OK)
                {
                    // Обновить кластеры
                    InitializeExistingNetwork(_networkBase.NetworkId);
                    Btn_Test_Click();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        public async Task <NetworkDataSet> AddDataSet(string name, string content, FileType fileType)
        {
            if (string.IsNullOrEmpty(name))
            {
                throw new ArgumentException("Name must not be empty.", nameof(name));
            }

            if (string.IsNullOrEmpty(content))
            {
                throw new ArgumentException("Content must not be empty.", nameof(content));
            }

            var hash = _hashService.GetHashFor(content);

            if (await ExistsDataSet(hash))
            {
                throw new NetworkDataSetExistsException($"Data set already exists in the system.");
            }

            var network  = ReadNetwork(content, fileType);
            var edgeList = GetEdgeList(network);

            var dataSet = new NetworkDataSet
            {
                Name       = name,
                Content    = content,
                EdgeList   = edgeList,
                FileType   = fileType,
                Hash       = hash,
                NodeCount  = network.ActorCount,
                EdgeCount  = network.Layers.Sum(l => l.Edges.Count) + network.InterLayerEdges.Count,
                LayerCount = network.LayerCount,
                ActorNames = network.Actors.Select(a => a.Name).ToList(),
                LayerNames = network.Layers.Select(l => l.Name).ToList()
            };

            await _ctx.DataSets.AddAsync(dataSet);

            await _ctx.SaveChangesAsync();

            return(dataSet);
        }
        /// <summary>
        /// Обучить нейронную сеть.
        /// </summary>
        /// <param name="inputDataSet">Набор входных данных для обучения.</param>
        /// <param name="neuronsCount">Количество нейронов.</param>
        /// <param name="iterationsCount">Количество эпох.</param>
        public virtual void Study(NetworkDataSet inputDataSet, int neuronsCount, int iterationsCount)
        {
            GenerateNeurons(inputDataSet?.Attributes, neuronsCount);

            for (int iteration = 0; iteration < iterationsCount; iteration++)
            {
                var randomNumber = _random.Next(0, inputDataSet.Entities.Count - 1);
                var randomEntity = inputDataSet.Entities[randomNumber];

                var attributeValues = randomEntity.AttributeValues
                                      .Select(e => new InputAttributeValue
                {
                    InputAttributeNumber = e.Attribute.OrderNumber,
                    Value = e.GetNormalizedValue(NormalizationType)
                })
                                      .ToList();

                var totalError = StudyInputEntity(attributeValues, iteration, iterationsCount);
                IterationCompleted?.Invoke(this, null);
            }
        }
Esempio n. 10
0
        public MainForm(
            INetworkService networkService,
            IReader reader,
            AbstractNetwork network,
            int? networkId = null,
            int? parentNeuronId = null,
            NetworkDataSet parentNeuronDataSet = null)
        {
            InitializeComponent();

            _reader = reader;
            _networkService = networkService;
            _converter = new NetworkDataSetConverter();
            _interfaceMediator = new InterfaceHelpers();

            _neuralNetwork = network;
            _neuralNetwork.IterationCompleted += OnNetworkWeightsChanged;

            // При редактировании существующей сети скрыть обучение
            var isEdit = networkId > 0;
            if (isEdit)
            {
                InitializeExistingNetwork(networkId ?? 0);
            }
            else
            {
                _networkBase = new NetworkBase
                {
                    ParentNeuronId = parentNeuronId
                };
            }

            if (parentNeuronId > 0)
            {
                if (parentNeuronDataSet == null || !(parentNeuronDataSet?.Entities?.Any() ?? false))
                {
                    throw new Exception("Не задан набор обучающих данных для повторной кластеризации.");
                }
                _learningDataSet = parentNeuronDataSet;
                _testingDataSet = parentNeuronDataSet;
                btnChooseLearningFile.Enabled = false;
                btnChooseTestingFile.Enabled = false;

				RecalcMinMaxValues(_learningDataSet);
				RecalcMinMaxValues(_testingDataSet);

				_neuralNetwork.InputAttributes = _learningDataSet.Attributes
                    .Select(a => new InputAttributeBase
                    {
                        InputAttributeNumber = a.OrderNumber,
                        Name = a.Name
                    })
                    .ToList();

                _interfaceMediator.DrawDataIntoGrid(_learningDataSet.Entities, _neuralNetwork.InputAttributes, dgvInputLearningData);
                var normalizedData = _learningDataSet.Entities
                    .Select(l => new NetworkDataEntity()
                    {
                        Name = l.Name,
                        OrderNumber = l.OrderNumber,
                        AttributeValues = l.AttributeValues.Select(a => new NetworkEntityAttributeValue
                        {
                            Attribute = a.Attribute,
                            Value = a.GetNormalizedValue(_neuralNetwork.NormalizationType)
                        }).ToList()
                    })
                    .ToList();
                _interfaceMediator.DrawDataIntoGrid(normalizedData, _neuralNetwork.InputAttributes, dgvNormalizedLearningData);

                _interfaceMediator.DrawDataIntoGrid(_testingDataSet.Entities, _neuralNetwork.InputAttributes, dgvTesingData);
            }

            btnEditCluster.Enabled = isEdit;
            SetSaveButtonEnabled();
        }