public void ShouldConvertFromDataTable()
        {
            var reader        = new ExcelReader();
            var excelFileName = "Sample.xlsx";
            var excelFilePath = Path.Combine(CommonUtils.ResourcesDirectory, excelFileName);

            // Получаем DataTable, заодно проверяем работу провайдера данных из Excel
            var dataTable = reader.ReadFromFile(excelFilePath);

            Assert.IsNotNull(dataTable);
            Assert.IsTrue(dataTable.Rows.Count > 0);
            Assert.IsTrue(dataTable.Columns.Count > 0);
            Assert.IsNotNull(dataTable.Rows[0][0]);

            // Проверяем конвертер
            var networkConverter = new NetworkDataSetConverter();
            var networkDataSet   = networkConverter.Convert(dataTable);

            Assert.IsNotNull(networkDataSet);
            Assert.IsTrue(networkDataSet.Entities != null && networkDataSet.Entities.Any());
            Assert.IsTrue(networkDataSet.Attributes != null && networkDataSet.Attributes.Any());
        }
        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();
        }