El paquete Mathematica.jl
proporciona una interfaz para usar Wolfram Mathematica™ del lenguaje Julia. No puede utilizar Mathematica.jl
sin haber comprado e instalado una copia de Mathematica™ de Wolfram Research. Este paquete está disponible de forma gratuita y de ninguna manera reemplaza ni altera ninguna funcionalidad del producto Mathematica de Wolfram.
El paquete proporciona una sencilla interfaz Julia para Mathematica. Su objetivo es seguir la filosofía de Julia de combinar una expresividad de alto nivel sin sacrificar la optimización de bajo nivel.
Pkg . add ( " Mathematica " )
Siempre que Mathematica esté instalado, su uso es tan simple como:
using Mathematica
Fibonacci ( 1000 )
#= > 43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875
Todas las funciones de Mathematica están disponibles como funciones y macros, y el empalme ( $
) funciona como es 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
Incluyendo aquellos que devuelven datos de 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, ...}]
Los datos matemáticos pueden participar directamente en las funciones de Julia, sin necesidad de encapsularlos. Por ejemplo -
using MathLink
d = BinomialDistribution ( 10 , 0.2 ) #= > BinomialDistribution[10, 0.2]
probability(b::MExpr{:BinomialDistribution}) = b.args[2]
probability(d) #= > 0.2
Los datos compatibles con Julia (por ejemplo, listas, números complejos, etc.) se convertirán automáticamente y podrá ampliar la conversión a otros tipos.
Tenga en cuenta que las expresiones de Mathematica no se convierten a expresiones de Julia de forma predeterminada. Las funciones/macros con la sugerencia ::Expr
(ver más abajo) convertirán su resultado, pero para otras debes usar convert
o MathLink.to_expr
.
Log ( - 1 ) #= > Times[0 + 1im, :Pi]
convert(Expr, ans) #= > :(*(0 + 1im,Pi))
N(Log(-1)) #= > 0.0 + 3.141592653589793im
También se admiten impresiones y advertencias:
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, por supuesto:
WolframAlpha ( " hi " ) #= >
2-element Array{Any,1}:
{{"Input",1},"Plaintext"}->"Hello."
{{"Result",1},"Plaintext"}->"Hello, human."
En el archivo Mathematica.jl
, verá una lista de especificaciones de funciones y macros, cada una en uno de estos formatos:
Function :: ReturnType # or
Function (Arg1Type, Arg2Type, ... ) :: ReturnType # (functions only)
Por ejemplo:
Integrate :: Expr
RandomReal (Number) :: Float64
RandomReal (Number, Integer) :: Vector{Float64}
La sugerencia del tipo de retorno aquí es una optimización; permite MathLink.jl
tomar el valor de Mathematica sin realizar primero una verificación de tipo y hace que el tipo de función sea estable; por ejemplo, RandomReal(10, 5)
devolvería una matriz Any
si no fuera por esta definición. Los tipos de argumentos permiten la verificación de tipos y múltiples definiciones.
No muchas funciones tienen firmas de tipo todavía, por lo que proporcionarlas para las funciones que desea utilizar es una manera fácil de contribuir.
La expresión de datos de Mathematica Head[x,y,z,...]
se representa en Julia como MExpr{:Head}(args = {x,y,z,...})
. Podemos extender Mathematica.jl
para admitir tipos personalizados sobrecargando MathLink.to_mma
y MathLink.from_mma
.
Por ejemplo, podemos pasar un Julia Dict directamente a través de Mathematica con solo dos líneas de definiciones:
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
Esto debería funcionar siempre que alguna de math
esté en el camino (normalmente es cierto en Linux). Mathematica.jl
también buscará math.exe
en Windows, lo que debería funcionar para las versiones 8 o 9 de Mathematica instaladas en las ubicaciones predeterminadas. Si no le funciona, abra un problema (en particular, no sé cómo se comportará en Mac).