Портирование Mathematica в Октаву - PullRequest
5 голосов
/ 14 декабря 2011

Мне нужно перенести много файлов из Mathematica в Octave.Я нашел парсер Lisp Mathematica из ~ 1991 , но я не очень знаком с Lisp, поэтому мне было интересно, есть ли у кого-нибудь опыт работы с портированием в этом направлении.После исследования и отправки электронного письма в WolframAlpha, но без реальных результатов, мне пришлось бы использовать Lex и Yacc для создания кросс-компилятора.Мне кажется, это немного излишне.

Любые подсказки или указатели будут с благодарностью.

Уточнение:

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

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

Ответы [ 3 ]

18 голосов
/ 14 декабря 2011

Я работаю с MATLAB (версия Octave для $$$$) и Mathematica довольно регулярно, и я чертовски уверен, что невозможно реализовать парсер / переносчик, который автоматически конвертирует Mathematica в другой.Для начала, MATLAB / Octave не поддерживает сопоставление с образцом, переписывание терминов или функциональное программирование, все из которых являются наиболее распространенными и оптимальными стилями кодирования в Mathematica.

Например, рассмотрим чистую функцию (Mathematica)

f = #^2&;

Этого нет в MATLAB / Octave.Анонимные функции достаточно близки, и вы можете написать это как (MATLAB / Octave)

g=@(x)x.^2;

Однако Mathematica будет символически квадратировать все, что вы передадите в функцию, тогда как MATLAB будет работать только наскаляры / векторы / матрицы.Поэтому, даже если вы сталкиваетесь с чистой функцией, вы не можете автоматически переписать ее в анонимную функцию, не понимая, что передается чистой функции.

Другая концепция, которая отсутствует в MATLAB / Octave, - это концепция lazy.оценка / SetDelayed или := в Mathematica.Поэтому, если ваша чистая функция была

f := a #^2 &;

, тогда f использует значение a во время вызова f.Однако, записав его как анонимную функцию:

g = @(x)a*x.^2;

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

Если у вас есть кодовая база, написанная в Mathematica в основном в процедурном стиле, то это может быть возможнымпо идее переводить в октаву.Однако мне тяжело представить серьезный проект Mathematica, написанный полностью процедурным образом.Короче говоря, человеку нужно перевести логику идиоматически для каждого языка


Наконец, если вы пытаетесь просто преобразовать выражения из Mathematica в MATLAB / Octave, то вы можете захотетьвзгляните на пакет ToMatlab.Я использую это довольно часто для преобразования выражений из вычислений в Mathematica для использования в другой кодовой базе в MATLAB.Простым примером будет:

expr = Sin[x + x^3] + ArcSin[y];
ToMatlab[expr]
Out[1]= sin(x + x.^3) + asin(y)
11 голосов
/ 14 декабря 2011

Вам не нужен парсер Mathematica для переноса.Вам необходимо написать программу переноса в Mathematica и повторно использовать собственный синтаксический анализатор Mathematica.Это в том же направлении, что и SymbolicC.Если бы я был вами, я бы сконструировал некоторый подъязык Mathematica (назовите его SymbolicOctave) с полностью инертными головками, а затем написал бы функцию под названием say ToOctaveCodeString.Вы можете проконсультироваться с реализацией SymbolicC, чтобы увидеть, как это было сделано для C - она ​​доступна в дистрибутиве Mathematica.

Вторая и самая сложная часть заключается в написании переводчика из подмножества кода Mathematica в это инертное представление SymbolicOctave.Эта часть на самом деле нетривиальна, потому что (предположительно) язык Mathematica имеет много функций, которые язык Octave не поддерживает изначально, и вам придется реализовать их в Octave.Здесь вам также понадобится использовать определенные методы для генерации кода Mathematica с помощью Mathematica, один из которых я описал в этом ответе .Все это предполагает, что у вас есть доступ к Mathematica.

Сказав все это, я бы отказался от общей задачи и просто использовал Mathematica, если есть такая возможность.Задача кажется где-либо выполнимой только для очень узкого и специфического подмножества Mathematica, и даже тогда она будет нетривиальной.Если есть возможность связать Mathematica и использовать его из Octave вместо того, чтобы переносить все в Octave, я бы пошел по этому пути (технически это должно быть легко сделать).Учитывая, что стоимость даже коммерческой лицензии на полную версию Mathematica в настоящее время довольно низкая (по сравнению с конкурирующими продуктами, особенно с учетом продуктов, подобных Octave), этот вариант вполне может быть финансово лучшим вариантом, учитывая затраты на разработку для создания конвертера.что было бы хорошо.

2 голосов
/ 16 декабря 2011

Идиоматический способ создания кода для менее мощной системы из Mathematica - это не использовать сторонний инструмент (который должен быть таким же мощным, как ядро ​​Mathematica), а использовать сам Mathematica.

Некоторые из генераторов кода такого рода уже доступны из коробки (для C и Fortran), посмотрите, как они реализованы, а затем перенастройте их для Octave / Matlab.

...