Есть ли символьная c реализация PDL API? - PullRequest
3 голосов
/ 06 мая 2020

Чтобы протестировать матричный алгоритм, я хотел бы иметь возможность вычислять с помощью переменных, а не только чисел, но не изменять сам алгоритм.

Направление, в котором я предполагаю, что есть решение (но, вероятно, есть приветствуются и другие) будет использовать полиморфизм в 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 и, вероятно, расширенного с помощью функции индексирования-именования для ячейки внутри более крупных элементов для повышения удобства использования.

Есть ли лучший способ, чем программировать эту библиотеку с нуля?

...