En uno de mis documentos, enumero algunos resultados numéricos además de algunas cifras. Lo que me gustaría hacer es asegurarme de que los resultados numéricos en mi trabajo siempre estén de acuerdo con el código. En este momento, solo copie directamente los resultados numéricos de mi salida de simulación en el papel, que es extremadamente simple y de baja tecnología, pero propenso a errores, porque podría copiar mal los resultados u olvidar sincronizar los resultados del papel con el salida de código
¿Hay una buena manera de mantener sincronizados los resultados numéricos que cito en mis documentos con los resultados generados por mi código? (Aquí, supongo que ejecutar el código es fácil y práctico cuando quiero actualizar mi trabajo). Estos resultados numéricos no necesariamente se prestan en forma tabular. A veces, tengo tablas en manuscritos, pero más comúnmente, tengo parámetros de simulación listados como números en ecuaciones . Un ejemplo sería algo como:
donde me gustaría reemplazar los elementos de la condición inicial con los parámetros reales que uso en una simulación que integra numéricamente un sistema de ecuaciones diferenciales ordinarias. Usar una tabla para datos únicos como este ejemplo parece excesivo y más tinta de la necesaria.
Supongo que las cifras son un caso más fácil: cada vez que el documento se "construye" (desde la fuente LaTeX, Markdown, RST, etc.), inicie el proceso de compilación ejecutando el código. Sin embargo, si las personas tienen mejores sugerencias para mantener sincronizadas las cifras generadas por mis simulaciones con mi trabajo, me encantaría escucharlas.
fuente
spin()
función. Personalmente, creo que las quejas de Greg Wilson sobre la programación alfabetizada son bastante anticuadas. Tuve la misma experiencia terrible que describe con noweb, pero esa depuración complicada simplemente no existe en las herramientas modernas. Para CI alfabetizado use doxygen. Knitr es algo más fácil de depurar que R gracias al almacenamiento en caché y al manejo del entorno.Lo que está pidiendo es el gran desafío de Elsivier del "Documento ejecutable" . Si bien se han probado muchos enfoques, ninguno es tan convincente como los autores podrían sugerir. Aquí hay algunos ejemplos de técnicas utilizadas.
Madagascar Project adopta su enfoque, dentro del guión make se ejecutan las simulaciones que producen las figuras y el papel simultáneamente.
IPython Notebook proporciona un documento que se puede ejecutar a medida que lee y produce cifras para el contenido de su corazón. (He visto complementos de palabras, Mathematica y muchas otras soluciones utilizadas de la misma manera)
VisTrails utiliza un enfoque de arquitectura orientado a servicios y proporciona un administrador de "providencia" o "flujo de trabajo". Básicamente, registra ganchos para codificar y luego diseña un flujo de trabajo o experimento que reproduce su trabajo. Se ha utilizado en muchos tipos de códigos, incluso en clústeres de HPC. Con este enfoque, tendrá una manera de reproducir los experimentos.
Hay toneladas de este tipo de soluciones, pero esas son las tres que me impresionaron. Es un problema difícil y creo que realmente ni siquiera estamos cerca de abordarlo. Ni siquiera podemos lograr que las personas publiquen su código con sus documentos, ¿cómo podemos esperar que reproduzcan los resultados = P
fuente
No he tenido mucho éxito al usar las soluciones de otras personas para este problema. Por lo general, solo quiero algo simple que funcione para mí y haga el trabajo. Con este fin, generalmente trato de escribir un script de Python que se encargue de ejecutar todos los resultados, analizar el resultado, así como construir las figuras / tablas.
Escribo mis códigos para generar archivos de datos que contienen los resultados en algún formato de texto. Puede evitar volver a ejecutar estos resultados en su script probando primero la existencia del archivo de salida (en python usando os.path.isfile (), por ejemplo). Si desea volver a ejecutar sus resultados, simplemente elimine los archivos de datos. Si existen los archivos de datos, entonces ejecuto un analizador de estos archivos. Para esto, el módulo python para expresiones regulares es muy útil (re).
Luego, a partir de la salida analizada, creo las figuras o tablas. Para las tablas en látex, puede escribir el código para generar la tabla en un archivo separado (uso una extensión .tbl) y luego incluir esto en su archivo de látex. La clave para mí es usar 1 script de Python. Si tengo muchos, luego me pregunto cuál es cuál y qué hacen. Si esta descripción es demasiado vaga, puedo enviarle algunos ejemplos.
fuente
\input{|"path-to-script.py"}
. Creo que es mejor poner todos los parámetros en un solo archivo de Python (o cualquier idioma que sea su favorito) y usar el parámetro de línea de comando para acceder a él\input{|"path-to-script.py param-name"}
. En este caso, puede incluir el archivo param en otros scripts para ejecutar las simulaciones. Sin embargo, hace que la compilación sea más lenta y tiene algunos otros puntos negativos.Aún más importante, en mi opinión, es asegurarse de que pueda descubrir cómo volver a generar todos sus resultados desde cero en un mes o un año (por ejemplo, cuando los árbitros le piden que agregue o modifique algo). Para ese propósito, lo que hago es incluir un archivo de texto con instrucciones muy detalladas sobre cómo reproducir todos los resultados. Es mejor si los prueba haciendo que alguien más (como un coautor) los pruebe. Recomiendo que también proporcione estas instrucciones (y todo su código) a los árbitros y lectores.
Aquí hay un ejemplo (realmente preparado por mi coautor, Aron Ahmadia).
fuente
El orgmode de Emacs en combinación con Babel logra eso. Babel puede ejecutar fragmentos de código de varios lenguajes de programación y scripts, por ejemplo, podría abrir el archivo que contiene los datos de simulación y ponerlo en una tabla en orgmode, que puede exportarse a LaTeX (y muchos otros formatos). Lleva bastante tiempo acostumbrarse a todos los combos de teclas en orgmode, pero una vez que se ejecuta, todo es automático.
fuente
Si ejecutar todo su código es barato, entonces podría hacer algo de baja tecnología como lo siguiente:
Puede modelar sus documentos con cadenas formateadas para que se vean así
Tener scripts de Python que se vean así
Y luego haz algo como esto
Entonces podría envolver esto en un Makefile.
fuente
Si está utilizando LaTeX, una solución relativamente de baja tecnología es hacer que su código escupe un archivo (o usar un script para filtrar desde la salida de su código) que contiene un montón de líneas como esta:
\newcommand{\myresults1}{<value>}
Luego puede usar el
\input
comando para agregar ese archivo a su documento, y usar los comandos definidos para colocar los valores.fuente
Yo trabajo para Elsevier. Mi compañía ha comenzado a usar el marco Collage (desarrollado en respuesta al Gran desafío del papel ejecutable) en números de revistas para permitir a los autores publicar fragmentos de código ejecutable con su artículo. Esta característica facilita a los lectores reproducir los resultados informados en el artículo y reutilizar el material publicado para su propia investigación. Collage admite una amplia variedad de software de código abierto y propietario; Puede encontrar más información en el video informativo aquí y en el sitio web de Collage Authoring Environment .
fuente