Как проверить научное программное обеспечение? - PullRequest
32 голосов
/ 06 августа 2010

Я убежден, что тестирование программного обеспечения действительно очень важно, особенно в науке.Однако за последние 6 лет я никогда не сталкивался ни с одним научным программным проектом, который регулярно проходил испытания (и большинство из них даже не контролировалось версией).

Теперь мне интересно, как вы справляетесь с программными тестами для научных кодов (числовые вычисления).

С моей точки зрения, стандартные модульные тесты часто упускают суть, поскольку нет точного результата, поэтому использование assert(a == b) может оказаться немного сложным из-за "обычных" числовых ошибок.

Так что я с нетерпением жду ваших мыслей по этому поводу.

Ответы [ 4 ]

11 голосов
/ 23 апреля 2012

Просто смотрел на похожую проблему (google: «тестирование научного программного обеспечения») и предложил несколько статей, которые могут быть интересны.Они охватывают как мирские ошибки кодирования, так и более серьезные вопросы, связанные с определением правильности результата (глубина земной мантии?)

http://http.icsi.berkeley.edu/ftp/pub/speech/papers/wikipapers/cox_harris_testing_numerical_software.pdf

http://www.cs.ua.edu/~SECSE09/Presentations/09_Hook.pdf (не работаетссылка; новая ссылка http://www.se4science.org/workshops/secse09/Presentations/09_Hook.pdf)

http://www.associationforsoftwaretesting.org/?dl_name=DianeKellyRebeccaSanders_TheChallengeOfTestingScientificSoftware_paper.pdf

Я подумал, что идея мутационного тестирования, описанная в 09_Hook.pdf (см. также matmute.sourceforge.net), особенно интересна, поскольку она имитируетпростые ошибки, которые мы все совершаем. Самое сложное - научиться использовать статистический анализ для определения уровней достоверности, а не однократные проверки кода (человек или машина).

Проблема не нова. Я уверен, что яесть оригинальная копия «Насколько точна научная программа?» Хаттона и др., октябрь 1994 г., которая даже тогда показала, как различные реализации одних и тех же теорий (в виде алгоритмов) довольно быстро расходятся (это также ссылка 8 в статье Келли и Сандерса)

11 голосов
/ 06 августа 2010

Я также учусь в академических кругах и написал программы квантово-механического моделирования для нашего кластера. Я сделал то же самое замечание относительно тестирования или даже контроля версий. Я был еще хуже: в моем случае я использую библиотеку C ++ для своих симуляций, а код, полученный от других, был чистым спагетти-кодом, без наследования, даже без функций.

Я переписал его, а также провел некоторое модульное тестирование. Вы правы в том, что вам приходится иметь дело с числовой точностью, которая может отличаться в зависимости от архитектуры, на которой вы работаете. Тем не менее, модульное тестирование возможно, если учесть эти ошибки округления чисел. Ваш результат не должен зависеть от округления числовых значений, иначе у вас будет другая проблема с надежностью вашего алгоритма.

Итак, в заключение я использую модульное тестирование для своих научных программ, и это действительно делает нас более уверенными в результатах, особенно в отношении публикации данных в конце.

8 голосов
/ 08 августа 2010

Я также использую cpptest для его TEST_ASSERT_DELTA.Я пишу высокопроизводительные числовые программы для вычислительной электромагнетики и с удовольствием использую их в своих программах на C ++.

Обычно я занимаюсь тестированием научного кода так же, как и с любым другим видом кода.только с несколькими ретушами, а именно:

  • Я всегда проверяю свои числовые коды на случаи, которые не имеют физического смысла, и проверяю, что вычисление действительно останавливается, прежде чем получить результат.Я усвоил это нелегким путем: у меня была функция, которая вычисляла некоторые частотные характеристики, а затем в качестве аргументов предоставляла матрицу, построенную на их основе, для другой функции, которая в итоге дала свой ответ в виде одного вектора.Матрица могла иметь любой размер в зависимости от того, на сколько терминалов был подан сигнал, но моя функция не проверяла, соответствует ли размер матрицы количеству терминалов (2 терминала должны были означать матрицу 2 x 2 xn);однако сам код был упакован так, чтобы не зависеть от этого, ему было все равно, какого размера матрицы, поскольку он просто должен был выполнить с ними некоторые базовые операции над матрицами.В конце концов, результаты оказались вполне правдоподобными, вполне в ожидаемом диапазоне и, фактически, частично верными - искажалась только половина вектора решения.Мне понадобилось время, чтобы понять.Если ваши данные выглядят корректно, они собраны в правильную структуру данных и числовые значения хороши (например, нет NaN или отрицательное число частиц), но это не имеет физического смысла, функция должна изящно завершиться ошибкой.

  • Я всегда тестирую подпрограммы ввода / вывода, даже если они просто читают набор разделенных запятыми чисел из тестового файла.Когда вы пишете код, который искажает математику, всегда соблазнительно прыгать в отладку той части кода, которая настолько сложна, что вам нужен толчок от кофеина, чтобы понять символы.Несколько дней спустя вы понимаете, что вы также добавляете значение ASCII \n в свой список точек.

  • При проверке математического отношения я всегда проверяю его «по книге»и я тоже узнал это на примере.Я видел код, который должен был сравнивать два вектора, но проверял только равенство элементов и не проверял равенство длины.

2 голосов
/ 06 августа 2010

Пожалуйста, посмотрите на ответы на вопрос SO Как правильно использовать TDD для реализации численного метода?

...