5

Tengo que portar muchos archivos de Mathematica a Octave. Encontré un Lisp Mathematica parser from ~1991 pero no estoy muy familiarizado con Lisp, así que me preguntaba si alguien tiene alguna experiencia con la migración en esta dirección. Después de investigar y enviar un correo electrónico a WolframAlpha y sin resultados reales, tendría que usar Lex y Yacc para producir un compilador cruzado. Esto me parece un poco excesivo.Portando Mathematica a Octave

Alguna pista o punteros sería muy apreciada.

Aclaración:

estoy empezando con una gran cantidad de archivos de Mathematica y su funcionalidad tiene que ser portado a Octave. Solo quiero lograr este objetivo en el menor tiempo posible, ya que esta es una tarea que mi jefe me encargó durante las vacaciones. Gracias por su ayuda, veré FullForm y examinaré el archivo de Mathematica para contenido no portátil. Si solo es posible convertir una cierta cantidad de archivos, tendría que hacer el resto a mano, lo que llevaría algún tiempo. Así que esto es básicamente una cosa de una vez para pasar de un programa a otro.

Como se menciona en el post de Leonid, la tarea parece excesivo, pero yo soy un asistente de investigación de los estudiantes y esto es exactamente la tarea que tengo que completar en mi departamento.

+1

Mathematica y Octave son lo suficientemente diferentes que estoy seguro de que la conversión automática es imposible. ¿Puedes describir con más detalle lo que necesitas? Un analizador de Mathematica en C? Un analizador para expresiones [FullForm] (http://reference.wolfram.com/mathematica/ref/FullForm.html) es relativamente fácil de escribir, y puede usar Mathematica para convertir todo a FullForm. Pero creo que primero debes aclarar tu pregunta. – Szabolcs

+1

¿Por qué parece excesivo? Si los archivos contienen solo expresiones simples, debería ser simple, de lo contrario puede extenderse hasta la reimplementación efectiva de mathematica en octava. – acl

Respuesta

11

No es necesario Mathematica analizador al puerto. Necesita escribir su programa de portabilidad en Mathematica y reutilizar el propio analizador de Mathematica. Esto es en la misma dirección que SymbolicC. Si yo fuera tú, construiría algún sublengua de Mathematica (llámalo SymbolicOctave), con cabezas completamente inertes, y luego escribiré una función llamada say ToOctaveCodeString. Puede consultar la implementación de SymbolicC para ver cómo se hizo esto para C: está disponible dentro de la distribución de Mathematica.

La segunda y más complicada parte sería escribir un traductor desde el subconjunto del código de Mathematica a esta inerte SymbolicOctave representación. Esta parte no es realmente trivial, porque (presumiblemente) el lenguaje Mathematica tiene muchas características que el lenguaje Octave no admite nativamente, y deberá implementarlas en Octave. Aquí también necesitará usar ciertas técnicas para generar el código de Mathematica con Mathematica, una de las cuales describí en this answer. Todo esto supone que tienes acceso a Mathematica.

Habiendo dicho todo esto, le daría a la tarea general y sólo tiene que utilizar Mathematica, si existe esa opción. La tarea parece en cualquier parte factible solo para un subconjunto muy estrecho y específico de Mathematica, e incluso entonces no sería trivial. Si hay una opción para vincular Mathematica y utilizarlo desde Octave en lugar de portar todo a Octave, iría por ese camino (técnicamente esto debería ser fácil de hacer). Con el costo de la licencia, incluso comercial para la plena Mathematica siendo bastante baja en estos días (en comparación con los productos de la competencia, sobre todo teniendo en los productos de la mente similares a octava), bien puede ser una mejor opción también económicamente, teniendo en cuenta los costes de desarrollo para crear un convertidor lo cual sería bueno.

+1

@ Mr.Wizard Gracias, corregido. Gracias también por un voto positivo. –

18

Trabajo tanto con MATLAB (la versión $$$$ de Octave) como con Mathematica con bastante regularidad, y estoy bastante seguro de que es imposible implementar un analizador/creador que convierta automáticamente de Mathematica a la otra. Para empezar, MATLAB/Octave no es compatible con la coincidencia de patrones o la reescritura de términos o la programación funcional, todos los cuales son los estilos de codificación más comunes y óptimos en Mathematica.

Por ejemplo, considere la función pura (Mathematica)

f = #^2&; 

en realidad no hay un equivalente de esto en MATLAB/Octave. Las funciones anónimas se acercan lo suficiente y se puede escribir como (MATLAB/Octave)

[email protected](x)x.^2; 

Sin embargo, Mathematica simbólicamente cuadrado nada se pasa a la función, mientras que MATLAB sólo funcionará en los escalares/vectores/matrices. De modo que, incluso si se encuentra con una función pura, no puede volver a escribirla automáticamente en una función anónima sin comprender qué se está pasando a la función pura.

Otro concepto que falta en MATLAB/Octave es el de la evaluación perezosa/SetDelayed o := en mathematica. Así que si su función era pura

f := a #^2 &; 

entonces, f utiliza el valor de a en el momento en f se llama. Sin embargo, la escritura como una función anónima:

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

capturará el valor de a en el momento de definición, formando un cierre. I proporcionar un mejor ejemplo en this answer of mine

Si usted tiene una base de código que está escrito principalmente en un estilo de procedimiento en Mathematica, entonces se podría ser posible, en teoría, para traducir a octava. Sin embargo, me cuesta imaginar un proyecto serio de Mathematica escrito completamente en forma de procedimiento. En resumen, se necesita un ser humano para traducir la lógica de una manera idiomática para cada idioma


Por último, si usted está tratando de convertir sólo expresiones de Mathematica para MATLAB/Octave, entonces es posible que desee tomar una mira el paquete ToMatlab. Lo uso con bastante frecuencia para convertir expresiones de cálculos en Mathematica para usar en una base de código diferente en MATLAB. Un ejemplo sencillo sería:

expr = Sin[x + x^3] + ArcSin[y]; 
ToMatlab[expr] 
Out[1]= sin(x + x.^3) + asin(y) 
2

Una manera idiomática de generar un código para un sistema menos capaz de Mathematica no es utilizar una herramienta de terceros (que debe ser tan potente como Mathematica núcleo), pero para utilizar Mathematica sí mismo.

Algunos de los generadores de código de este tipo ya están disponibles de fábrica (para C y Fortran), eche un vistazo a cómo se implementan y luego vuelva a enfocarlos para Octave/Matlab.

+0

Estoy de acuerdo en principio, pero para alguien que aún no conoce a mma y tiene que hacer esto durante las vacaciones, esto parece demasiado ambicioso, y algunas cosas pueden simplemente no ser traducibles (considere NDSolve). Pero podría estar equivocado, nunca lo intenté. – acl

+0

Elegiré una opción e intentaré convertir algún código para ver cuánto trabajo sería convertir todo. Luego puedo ver si es posible y puedo darle retroalimentación a mi jefe. – wikke

+0

@acl, con este enfoque Mathematica no convertirá todo (es absolutamente y claramente imposible), pero puede resolver simbólicamente lo que es posible resolver y producir un algoritmo numérico adecuado para la ejecución con un lenguaje de bajo nivel (como C o Matlab) Por supuesto, no puede convertir todo a ciegas, debe ser un proceso asistido manualmente. –