示例#1
0
        public void TestTableExtend()
        {
            IterTableStruct input_table = new IterTableStruct();

            input_table.row_headers = new double[2] {
                145, 150
            };
            input_table.column_headers = new double[2] {
                20, 22
            };
            input_table.matrix = new double[2, 2] {
                { 41.6, 35 }, { 44.3, 37.2 }
            };

            IterTableStruct expect_table = new IterTableStruct();

            expect_table.row_headers = new double[2] {
                145, 147.5
            };
            expect_table.column_headers = new double[2] {
                20, 21
            };
            expect_table.matrix = new double[2, 2] {
                { 41.6, 38.3 }, { 42.95, 39.525 }
            };

            TableExtender test_extender = new TableExtender(input_table);

            test_extender.extend();
            IterTableStruct real_result = test_extender.getNewMatrix(146, 20.3);

            for (int i = 0; i < 2; i++)
            {
                for (int j = 0; j < 2; j++)
                {
                    try
                    {
                        Assert.AreEqual(real_result.matrix[i, j], expect_table.matrix[i, j]);
                    }

                    catch (Exception e)
                    {
                        Console.WriteLine("Matrix test id failed. This is real meaning: " + real_result.matrix[i, j] + "; and expected: " + expect_table.matrix[i, j]);
                        throw e;
                    }
                }
            }

            for (int i = 0; i < 2; i++)
            {
                try
                {
                    Assert.AreEqual(real_result.column_headers[i], expect_table.column_headers[i]);
                }

                catch (Exception e)
                {
                    Console.WriteLine("Column headers test id failed. This is real meaning: " + real_result.column_headers[i] + "; and expected: " + expect_table.column_headers[i]);
                    throw e;
                }

                try
                {
                    Assert.AreEqual(real_result.row_headers[i], expect_table.row_headers[i]);
                }

                catch (Exception e)
                {
                    Console.WriteLine("Row headers test id failed. This is real meaning: " + real_result.row_headers[i] + "; and expected: " + expect_table.row_headers[i]);
                    throw e;
                }
            }
        }
        /// <summary>
        /// Непосредственно вычисление значения
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void вычислениеЗначенияToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                using (var calcDlg = new calculateDlg())                                                                       // Создаём экземпляр диалоговой формы
                {
                    var result = calcDlg.ShowDialog();                                                                         // Вызываем диалоговую форму, запрашиваем у пользователя входные данные

                    if (result == DialogResult.OK)                                                                             // Постараюсь как можно внятнее растолковать, что тут происходит...
                    {
                        double[] full_table_head_rows = getDoubleValuesFromHeadersOfRows();                                    // Заголовки строк для области данных во всей таблице
                        double[] full_table_head_cols = getDoubleValuesFromHeadersOfColumns();                                 // Заголовки для столбцов из области данных во всей таблице
                        double[,] full_table_data = getDoubleValuesFromData();                                                 // Непосредственно табличные значения из области данных, тоже вся таблица

                        int[] iter_matrix_rows_indexes = InterpolSearch.Execute(full_table_head_rows, calcDlg.hammingDist);    // Индексы заголовков строк искомых элементов в массиве, созданном выше. Важный момент, этот индекс не соответствует индексу из таблицы, что у пользователя на экране.
                        int[] iter_matrix_cols_indexes = InterpolSearch.Execute(full_table_head_cols, calcDlg.standDeviation); // Индексы заголовков столбцов для искомых в таблице данных

                        double[] iter_matrix_row_heads = new double[2];                                                        // Непосредственно заголовки строк искомых элементов
                        double[] iter_matrix_col_heads = new double[2];                                                        // Заголовки столбцов искомых элементов

                        for (int i = 0; i < 2; i++)                                                                            // Присваиваем значения двум последним массивам
                        {
                            iter_matrix_col_heads[i] = full_table_head_cols[iter_matrix_cols_indexes[i]];
                            iter_matrix_row_heads[i] = full_table_head_rows[iter_matrix_rows_indexes[i]];
                        }

                        double[,] iter_matrix = new double[2, 2]; // Здесь будут храниться табличные данные, над которыми будут производиться вычисления

                        // Запись преобразуемых табличных данных в двумерный массив, который будет обрабатываться дальше
                        for (int i = 0; i < 2; i++)
                        {
                            for (int j = 0; j < 2; j++)
                            {
                                iter_matrix[i, j] = full_table_data[iter_matrix_rows_indexes[i], iter_matrix_cols_indexes[j]];
                            }
                        }

                        string full_answer_str = ""; // Эта строка содержит полный ответ, который затем будет выведен в файл
                        string tmp_ans_str;          // Строка, куда будут записываться промежуточные результаты

                        tmp_ans_str = string.Format("Усреднение найденных значений: {0} бит", EntropyCalculator.calculate(iter_matrix));
                        MessageBox.Show(tmp_ans_str);                                                                                                                // Выводим среднее значение
                        full_answer_str += tmp_ans_str + '\n';                                                                                                       // Записываем

                        double iter_entropy = 0;                                                                                                                     // Значение энтропии, вычисленное на каждой итерации

                        IterTableStruct iter_table = new IterTableStruct();                                                                                          // Структура таблицы
                        iter_table.matrix         = iter_matrix;                                                                                                     // Записываем начальные табличные значения
                        iter_table.row_headers    = iter_matrix_row_heads;                                                                                           // Записывам заголовки строк
                        iter_table.column_headers = iter_matrix_col_heads;                                                                                           // Записываем заголовки столбцов

                        bool continue_iter = true;                                                                                                                   // Логическая переменная, отвечающая за то, продолжать ли вычисления
                        uint counter       = 0;                                                                                                                      // Счётчик итераций

                        while (continue_iter)                                                                                                                        // Пока пользователь говорит, что хочет продолжить
                        {
                            TableExtender iterTableExter = new TableExtender(iter_table);                                                                            // Создаём экземпляр класса для расширения таблицы на текущей итерации
                            iterTableExter.extend();                                                                                                                 // Расширяем таблицу

                            iter_table = iterTableExter.getNewMatrix(calcDlg.hammingDist, calcDlg.standDeviation);                                                   // Получаем новую таблицу

                            iter_entropy = EntropyCalculator.calculate(iter_table.matrix);                                                                           // Вычисляем среднее значение энтропии на данной итерации

                            tmp_ans_str      = string.Format("Результат по {0}-й итерации: {1} бит", Convert.ToString(counter + 1), Convert.ToString(iter_entropy)); // Записываем промежуточный результат
                            continue_iter    = ErrorHandler.processingQuestion(tmp_ans_str + ". Продолжить вычисления?");                                            // Выводим промежуточный результат
                            full_answer_str += tmp_ans_str + '\n';                                                                                                   // И записываем его в ответ

                            if (continue_iter)
                            {
                                counter++; // Увеличиваем счётчик
                            }
                        }

                        string file_name = "ans.txt"; // Имя файла для записи

                        if (File.Exists(file_name))   // Если он существует - удаляем
                        {
                            File.Delete(file_name);
                        }

                        using (FileStream file = File.OpenWrite(file_name))                     // Создаём файловый поток для создания файла и работы с ним
                            using (StreamWriter writer = new StreamWriter(file, Encoding.UTF8)) // Создаём поток для записи в файл
                                writer.Write(full_answer_str);                                  // Записываем данные в файл

                        Process.Start(file_name);                                               // Запускаем файл
                    }
                }
            }

            catch (Exception ex)
            {
                ErrorHandler.showErrorMessage(ex.Message + '\n' + ex.StackTrace);
            }
        }