Чтобы протестировать матричный алгоритм, я хотел бы иметь возможность вычислять с помощью переменных, а не только чисел, но не изменять сам алгоритм.
Направление, в котором я предполагаю, что есть решение (но, вероятно, есть приветствуются и другие) будет использовать полиморфизм в PDL или заменить библиотеку PDL библиотекой symboli c с тем же API, что и у PDL.
Чтобы проиллюстрировать мою точку зрения, ниже представлен простой реализованный алгоритм с использованием PDL:
use utf8;
use strict;
use warnings;
use PDL;
sub algorithm ($$) {
my $alpha = shift;
my $beta = shift;
my $A = pdl(
[ cos $alpha, -sin $alpha ],
[ sin $alpha, cos $alpha ],
);
my $B = pdl(
[ cos $beta, -sin $beta ],
[ sin $beta, cos $beta ],
);
print $A x $B;
}
Теперь, чтобы проверить код, вместо множества вызовов, таких как
algorithm 0.1, 0.1;
algorithm 0.2, 0.1;
algorithm 0.1, 0.2;
…
, используйте один вызов, аналогичный
algorithm 'α', 'β';
или - в равной степени приемлемо - аналогично
algorithm pdl('α'), pdl('β');
, который в конечном итоге выводит матрицу терминов в названных переменных α
и β
(конечно, латинские имена переменных a
и b
должны быть одинаково возможны ).
В идеале для этого ничего в алгоритме не нужно менять; В конце концов, я хочу протестировать алгоритм как есть, а не какой-то другой алгоритм. Добавление оператора use PDL::Symbolic qw( pdl );
или use SPDL qw( pdl );
в заголовок в качестве расширения или замены use PDL;
мне кажется приемлемо небольшим исключением из правила ничего не менять.
Единственное решение, которое приходит мне в голову в основном заключается в повторной реализации API PDL, по крайней мере, функций, используемых в моем алгоритме и, вероятно, с меньшим учетом эффективности, но с использованием объекта symboli c вместо каждой ячейки piddle и, вероятно, расширенного с помощью функции индексирования-именования для ячейки внутри более крупных элементов для повышения удобства использования.
Есть ли лучший способ, чем программировать эту библиотеку с нуля?