O pacote Mathematica.jl
fornece uma interface para usar o Wolfram Mathematica™ da linguagem Julia. Você não pode usar Mathematica.jl
sem ter adquirido e instalado uma cópia do Mathematica™ da Wolfram Research. Este pacote está disponível gratuitamente e de forma alguma substitui ou altera qualquer funcionalidade do produto Mathematica da Wolfram.
O pacote fornece uma interface Julia descomplicada para o Mathematica. O objetivo é seguir a filosofia de Julia de combinar expressividade de alto nível sem sacrificar a otimização de baixo nível.
Pkg . add ( " Mathematica " )
Desde que o Mathematica esteja instalado, seu uso é tão simples quanto:
using Mathematica
Fibonacci ( 1000 )
#= > 43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875
Todas as funções do Mathematica estão disponíveis como funções e macros, e a emenda ( $
) funciona como seria de esperar:
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
Incluindo aqueles que retornam dados do 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, ...}]
Os dados matemáticos podem participar diretamente das funções Julia, sem necessidade de empacotamento. Por exemplo -
using MathLink
d = BinomialDistribution ( 10 , 0.2 ) #= > BinomialDistribution[10, 0.2]
probability(b::MExpr{:BinomialDistribution}) = b.args[2]
probability(d) #= > 0.2
Dados compatíveis com Julia (por exemplo, listas, números complexos, etc.) serão todos convertidos automaticamente e você poderá estender a conversão para outros tipos.
Observe que as expressões do Mathematica não são convertidas em expressões Julia por padrão. Funções/macros com a dica ::Expr
(veja abaixo) converterão seu resultado, mas para outras você deve usar convert
ou MathLink.to_expr
.
Log ( - 1 ) #= > Times[0 + 1im, :Pi]
convert(Expr, ans) #= > :(*(0 + 1im,Pi))
N(Log(-1)) #= > 0.0 + 3.141592653589793im
Impressão e avisos também são suportados:
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]
Finalmente, é claro:
WolframAlpha ( " hi " ) #= >
2-element Array{Any,1}:
{{"Input",1},"Plaintext"}->"Hello."
{{"Result",1},"Plaintext"}->"Hello, human."
No arquivo Mathematica.jl
, você verá uma lista de especificações de funções e macros, cada uma em um destes formatos:
Function :: ReturnType # or
Function (Arg1Type, Arg2Type, ... ) :: ReturnType # (functions only)
Por exemplo:
Integrate :: Expr
RandomReal (Number) :: Float64
RandomReal (Number, Integer) :: Vector{Float64}
A dica do tipo de retorno aqui é uma otimização; ele permite que MathLink.jl
pegue o valor do Mathematica sem primeiro fazer uma verificação de tipo e torna o tipo de função estável - por exemplo, RandomReal(10, 5)
retornaria um array Any
se não fosse por esta definição. Os tipos de argumento permitem verificação de tipo e múltiplas definições.
Ainda não há muitas funções com assinaturas de tipo, portanto, fornecê-las para as funções que você deseja usar é uma maneira fácil de contribuir.
A expressão de dados do Mathematica Head[x,y,z,...]
é representada em Julia como MExpr{:Head}(args = {x,y,z,...})
. Podemos estender Mathematica.jl
para suportar tipos personalizados sobrecarregando MathLink.to_mma
e MathLink.from_mma
.
Por exemplo, podemos passar um Julia Dict direto pelo Mathematica com apenas duas linhas de definições:
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
Isso deve funcionar desde que a math
esteja no caminho (normalmente verdadeira no Linux). Mathematica.jl
também procurará math.exe
no Windows, que deve funcionar para as versões 8 ou 9 do Mathematica instaladas em locais padrão. Se não funcionar para você, abra um problema (em particular, não sei como isso se comportará em Macs).