Подтвердить что ты не робот

Как протестировать научное программное обеспечение?

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Просто смотрел на похожую проблему (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 в статье Келли и Сандерса)

--- (октябрь 2019 г.) Совсем недавно Тестирование научного программного обеспечения: систематический обзор литературы

Ответ 3

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

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

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

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

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