Разработка через тестирование в линейной алгебре - PullRequest
0 голосов
/ 31 октября 2018

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

for i,j = start1:end1, k,l = start2:end2
    A[i,j] = B[i,k] * C[k,l] * D[l,j]
end

, где A - новая матрица, вычисленная в функции.
с B C D, являющимися предопределенными матрицами.
где start1, start2, end1, end2 являются предопределенными целыми числами.

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

B[k,i]

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

Ответы [ 3 ]

0 голосов
/ 10 ноября 2018

Методика, которую я использовал для проверки подпрограмм умножения матриц, состоит в том, чтобы использовать матрицы только с одним 1, а все остальное - с нулем. Пусть E (i, j) - матрица

E(i,j)[k,l] = delta(i,k)*delta(j,l)

(т. Е. Имеет 1 в [i, j] и нули в других местах) Немного алгебры показывает, что

E(i,j)*E(i',j') = delta(j,i')*E(i,j')

Тест состоит в проверке того, что подпрограмма умножения получает ответ на запись для всех кортежей pow (n, 4) i, j, i ', j' с nxn матрицами.

0 голосов
/ 26 ноября 2018

Мой друг показал мне, как проверить эти функции.
Это делается путем насмешки матриц.
Вы можете представить

B[i,k]    

как

function B(i,k):    
return B[i,k]        

Теперь вы можете проверить их, создав список, который отслеживает входные данные.
Это дает следующую функцию.

function B(i,k):
list.append(i,k)
return B[i,k]

Затем этот список можно проверить, какой индекс является более быстрым. Это зависит от столбца или строки в первую очередь и от того, как вы определите свой цикл, но вы получите что-то вроде:

1   1
1   2
1   3
2   1
2   2
2   3
3   1
3   2
3   3

или

1   1
2   1
3   1
1   2
2   2
3   2
1   3
2   3
3   3

Теперь B[i,k] и B[k,i] в функции вопроса создадут разные списки, чтобы вы могли обнаружить ошибку и проверить ее.

0 голосов
/ 31 октября 2018

Можете ли вы показать мне, как вы бы сделали TDD в приведенном выше примере?

Хорошая новость заключается в том, что вы в основном имеете дело с функцией.

A = function(B,C,D,start1,end1,start2,end2)

Есть два основных подхода к внедрению тестов

1) начать с простых задач - матрицы один за другим, единичные матрицы; каждый раз, когда вы решаете, каким должен быть ответ, и проверяете, что правильный ответ выдает функция

2) начните с простых проверок - вы можете начать с того, чтобы убедиться, что ответ имеет правильное количество строк и столбцов, что удвоение одного из входов удваивает вывод и т. Д. Демонстрация Diamond Kata от Nat Pryce даст вам представление о том, как это может работать.

...