Пакет Mathematica.jl
предоставляет интерфейс для использования Wolfram Mathematica™ на языке Julia. Вы не сможете использовать Mathematica.jl
, не купив и не установив копию Mathematica™ от Wolfram Research. Этот пакет доступен бесплатно и никоим образом не заменяет и не изменяет какие-либо функциональные возможности продукта Wolfram Mathematica.
Пакет предоставляет простой интерфейс Julia для Mathematica. Он стремится следовать философии Джулии, заключающейся в сочетании выразительности высокого уровня без ущерба для оптимизации низкого уровня.
Pkg . add ( " Mathematica " )
Если система Mathematica установлена, ее использование очень просто:
using Mathematica
Fibonacci ( 1000 )
#= > 43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875
Все функции Mathematica доступны как в виде функций, так и в виде макросов, а сращивание ( $
) работает так, как и следовало ожидать:
Integrate (:(x ^ 2 ), :x ) # or
@Integrate (x ^ 2 , x)
#= > :(*(1//3,^(x,3)))
@Integrate(log(x), {x,0,2})
#= > :(+(-2,log(4)))
eval(ans) # or
@N($ans) # or
N(ans) # or
@N(Integrate(log(x), {x,0,2}))
#= > -0.6137056388801094
Включая те, которые возвращают данные Mathematica:
@Plot (x ^ 2 , {x, 0 , 2 })
#= > Graphics[{{{},{},{Hue[0.67, 0.6, 0.6],Line[{{4.081632653061224e-8,1.6659725114535607e-15},...}]}}}, {:AspectRatio->Power[:GoldenRatio, -1],:Axes->true, ...}]
Математические данные могут напрямую участвовать в функциях Julia, без необходимости переноса. Например -
using MathLink
d = BinomialDistribution ( 10 , 0.2 ) #= > BinomialDistribution[10, 0.2]
probability(b::MExpr{:BinomialDistribution}) = b.args[2]
probability(d) #= > 0.2
Данные, совместимые с Julia (например, списки, комплексные числа и т. д.), будут преобразованы автоматически, и вы можете расширить преобразование на другие типы.
Обратите внимание, что выражения Mathematica по умолчанию не преобразуются в выражения Julia. Функции/макросы с подсказкой ::Expr
(см. ниже) преобразуют свой результат, но для других необходимо использовать convert
или MathLink.to_expr
.
Log ( - 1 ) #= > Times[0 + 1im, :Pi]
convert(Expr, ans) #= > :(*(0 + 1im,Pi))
N(Log(-1)) #= > 0.0 + 3.141592653589793im
Также поддерживаются печать и предупреждения:
Print ( " hi " )
#= > hi
@Print(x^2/3)
#= > 2
# x
# --
# 3
Binomial(10)
#= > WARNING: Binomial::argr: Binomial called with 1 argument; 2 arguments are expected.
#= > Binomial[10]
Наконец, конечно:
WolframAlpha ( " hi " ) #= >
2-element Array{Any,1}:
{{"Input",1},"Plaintext"}->"Hello."
{{"Result",1},"Plaintext"}->"Hello, human."
В файле Mathematica.jl
вы увидите список спецификаций функций и макросов, каждая в одном из следующих форматов:
Function :: ReturnType # or
Function (Arg1Type, Arg2Type, ... ) :: ReturnType # (functions only)
Например:
Integrate :: Expr
RandomReal (Number) :: Float64
RandomReal (Number, Integer) :: Vector{Float64}
Подсказка о типе возвращаемого значения здесь является оптимизацией; это позволяет MathLink.jl
получать значение из Mathematica без предварительной проверки типа и делает тип функции стабильным - например, RandomReal(10, 5)
вернул бы массив Any
если бы не это определение. Типы аргументов допускают проверку типов и несколько определений.
Пока не многие функции имеют сигнатуры типов, поэтому предоставление их для функций, которые вы хотите использовать, — это простой способ внести свой вклад.
Выражение данных Mathematica Head[x,y,z,...]
представлено в Julia как MExpr{:Head}(args = {x,y,z,...})
. Мы можем расширить Mathematica.jl
для поддержки пользовательских типов, перегрузив MathLink.to_mma
и MathLink.from_mma
.
Например, мы можем передать Julia Dict прямо через Mathematica, используя всего две строки определений:
using MathLink; import MathLink : to_mma, from_mma
d = [ :a => 1 , :b => 2 ]
to_mma (d :: Dict ) = MExpr {:Dict} ( map (x -> MExpr ( :Rule , x[ 1 ], x[ 2 ]),d))
Identity (d) #= > Dict[:b->2, :a->1]
from_mma(d::MExpr{:Dict}) = Dict(map(x->x.args[1], d.args), map(x->x.args[2], d.args))
Identity(d) #= > {:b=>2,:a=>1}
using Mathematica
Это должно работать, пока на пути находится любая math
(обычно это верно в Linux). Mathematica.jl
также будет искать math.exe
в Windows, который должен работать для версий Mathematica 8 или 9, установленных в местоположениях по умолчанию. Если у вас это не работает, откройте проблему (в частности, я не знаю, как это поведет себя на Mac).