LINUX.ORG.RU

Как вы логируете формулы.

 ,


0

1

Вот, к примеру, у меня есть формула в коде и я хочу залогировать её вычисление, скажем, в LaTeX. В моём любимом CL я могу сделать одну сущность, которая будет и логировать и вычислять, благо макросы. В F#, где появилась такая необходимость на самом деле, я разделяю логгер и вычисление, потому что писать свой интерпретатор формул слишком не оправданно, но может есть что-то готовое(в том числе и в других ЯП)? Для тех кто ничего не понял, вот пример:

let a = boost 
let s = region.length
let t = (vmax.mhs - v0.mhs) / a
let s0 = v0.mhs*t + a*pw(t)/2.0
        
/// LaTeX
let latex = Latex.Latex()
["v_{max}",vmax.mhs; "v_{0}",v0.mhs; "a",a; "s",s; "t",t; "s_{0}",s0] 
|> List.iter (fun (s,v) -> latex.env.add(s,v))
latex.comp.add  @"t=frac{$v_{max}-$v_{0}}{$a}"
let res = latex.ToString()
// res: "t=frac{25-25}{0,8}"

не понятно что требуется. внутри латеха делать вычисления (luatex)? или «залогировать» означает последовательно вывести каждоый результат элементарной операции?

thunar ★★★★★ ()
Последнее исправление: thunar (всего исправлений: 1)
Ответ на: комментарий от thunar

Есть формула a=bmin+c, она в коде записана как, к примеру, var a = b.value+c.value, а в лог будет записана как «a = 10 + 21»

pseudo-cat ★★★ ()

Почитай мою статейку в ЖЖшке и/или на быдлохабре про вычисления в латехе. Запросто реализуются простые вычисления с float'ами (даже тригонометрия и решение кубических уравнений) + "электронные таблицы".

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

там какой-то пакет fp, видимо отдельная программа. А у меня в коде вычисления, в рантайме, не буду же я вызывать другой процесс на каждое вычисление)

pseudo-cat ★★★ ()
Ответ на: комментарий от Eddy_Em

ну в CL с помощью макросов, в F# пришлось отделить вычисление от генерации LaTeX

pseudo-cat ★★★ ()
Ответ на: комментарий от pseudo-cat

хотя хрен знает насчет макросов, мб овчинка не стоит выделки

pseudo-cat ★★★ ()
Ответ на: комментарий от pseudo-cat

Есть два варианта, как выполнять вычисления в латехе в реальном времени: либо сначала вызывать некий обработчик, который все посчитает и результаты выложит в отдельный файл (а латех этот файл заинклюдит); либо сам латех каждый раз, когда будет натыкаться на необходимость вычислений, будет вызывать внешнюю программу (потому что floating вычисления теха — это ад).

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

В моём случае латех всего лишь формат для логирования. Логично сделать некий парсер промежуточного формата вычислений, которой будет и считать и генерировать латех. Отсюда и появляются мысли про макросы, но описывать правила составления латеха что-то совсем не хочется.

К примеру,

(/ a b) -> `(\frac ,a ,b)  

pseudo-cat ★★★ ()
Ответ на: комментарий от Eddy_Em

результаты выложит в отдельный файл (а латех этот файл заинклюдит); либо сам латех каждый раз, когда будет натыкаться на необходимость вычислений, будет вызывать внешнюю программу

и ко второму пришествию вычислится всё что нужно:)

pseudo-cat ★★★ ()
Ответ на: комментарий от pseudo-cat

Объявляешь в латехе что-нибудь вроде

\def\octave#1#2{#2}
\def\octavepic#1#2{(команды вставки рисунка #2)}
и втыкаешь код, который в октаве (к примеру) нужно посчитать в теги \octave, скажем,
\octavepic{A=textread("file"); semilog(A);}{pict.pdf}
Пишешь парсер, воспринимающий только внутренности тегов \octave и \octavepic (скажем, для случая выше внутренности развернутся в A=textread("file"); semilog(A); print -dpdf pict.pdf;) и по завершению просмотра файла запускающий октаву. Ну, а текстовые результаты ты фигачишь в файл octave_output.tex, который инклюдишь в начале своего документа.

Тогда, скажем, если тебе надо посчитать некую супер-пупер функцию от числа X, да и само число как-то определить, ты напишешь в латехе:

\octave{X = 4.123; ans = X;}{\Xval}
\octave{fn(X);}{\FNfal}
твой скрипт раскроет это в
X = 4.123; ans = X;
fprintf(outfile, "\\def\\Xval{%f}\n", ans);
fn(X);
fprintf(outfile, "\\def\\FNval{%f}\n", ans);
Естественно, в самом начале файла, который будет скармливаться октаве, будет лежать outfile = fopen("octave_output.tex", "w");, а в конце — fclose(outfile).

В итоге в самом латеховском файле появятся \Xval и \FNval, которые, благодаря заинклюженному в самом начале файлу octave_output.tex, раскроются в числа.

В общем, принцип совершенно тот же самый, что и со всякими оглавлениями, библиографией, предметными указателями и т.п.

Кстати, запускать свой парсер ты можешь непосредственно из латеха (он это умеет).

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от pseudo-cat

Не надо про пришествие: да, компилится долго, но все-таки не бесконечно долго. У меня сложный технический отчет десятка на три страниц с кучей формул и "электронных таблиц", вычисляемых непосредственно в латехе, компилялся где-то минуту.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

Вы не какой-нибудь Sweave обсуждаете? В чем ключевое отличие того, что вам надо от литературного программирования? Я просто устал к вечеру и не способен вникнуть.

ErasimHolmogorin ()
Ответ на: комментарий от ErasimHolmogorin

В чем ключевое отличие того, что вам надо от литературного программирования?

Я без понятия, что конкретно надо ТСу, просто говорю, как я сделал бы то, что нужно мне.

А что такое "литературное программирование", я вообще без понятия!

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

Ты со стороны вычислений рассматриваешь. Как если бы у меня был расчет какой нибудь физической системы и я бы строил программу вокруг этого расчета. Это мне не подходит. У меня помимо этого расчета есть куча других вещей в том же коде, которые зависят от расчета и наоборот.

pseudo-cat ★★★ ()
Ответ на: комментарий от pseudo-cat

Грамотное программирование

Пример можешь посмотреть тут: RSweave.pdf

Я не совсем вникал, что тебе нужно, но когда дело касается объединение текста на latex и программного кода, то единственное, что приходит в голову, так это Literate Programming.

Я пользуюсь RSweave, на лету делают отчеты с кучей графиков и различной информацией, очень удобно! Нет лишней суеты.

ErasimHolmogorin ()
Ответ на: комментарий от Eddy_Em

Я без понятия, что конкретно надо ТСу

*бьюсь головой об стену*)

Идея же элементарна и очевидна. Вот псевдокод:

a = 0
b = 7
c = a + b
Теперь мы хотим иметь лог работы этого кода, логично сделать так, к примеру:
a = 0
Log("a=".a);
b = 7
Log("b=".b);
c = a + b
Log("c=".c);
Теперь, предположим, мы смотрим в наш лог и думаем, а как это вычислилось 'c'? Ок:
a = 0
Log("a=".a);
b = 7
Log("b=".b);
c = a + b 
Log("c=".a."+".b) 
Log("c=".c);
Ну и как белые люди мы думаем, а нельзя ли сделать так, чтобы не писать отдельно Log(«c=».a.«+».b.«=».c) и c = a + b?

pseudo-cat ★★★ ()
Ответ на: комментарий от ErasimHolmogorin

Здóрово! Правда, в случае, когда тебе нужно будет сделать полный рефакторинг, ты запаришься по тексту выискивать нужный кусок! Поэтому таки классика рулит.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от ErasimHolmogorin

о спасибо, а можешь, чтобы быстро понять то ли это или нет показать, как ты добавишь в отчет вычисление a = b + c?

pseudo-cat ★★★ ()
Ответ на: комментарий от pseudo-cat

Слишком сложный лексический анализ получится. Не взлетит.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

Я основную разработку веду классическим путем, но в случае отчетов использую Sweave, дергая свои функции, объекты, методы. Сам по себе рефакторинг в этих случаях не нужен.

Второй момент — описание работы алгоритмов. Берешь созданные и отрефакторенный алгоритм и создаешь для него документацию с помощью ГП. В одном файле у тебя и документация и программный код, напомню, что на выхлопе из файла .Rnw я получаю файлы: .tex с уже исполненным кодом и нарисованными графиками, и файл .R, который могу отдельно запустить.

ErasimHolmogorin ()
Ответ на: комментарий от ErasimHolmogorin

На сях точно так же фиг сделаешь. Но можно при помощи какого-нибудь doxygen генерировать документацию из комментариев.

А вообще, такие задачи крайне редко возникают. Обычно данные у тебя уже готовы, надо лишь отчет написать. Я велосипедил с вычислениями в латехе только потому, что в процессе согласования отчета и ТЗ возникали всякие поправки, а после того, как я 1 раз лоханулся, не подправив все изменения по тексту, решил делать это автоматом.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от pseudo-cat
Вычислим A используя формулу A=B+C:
<<echo=T>>=
a<-b+x;
print(a);
@
Полученный результат...

Вычислим A используя формулу A=B+C:

> a<-b+c;
> print(a);
[1] 7
Полученный результат...

ErasimHolmogorin ()
Ответ на: комментарий от Eddy_Em

На сях точно так же фиг сделаешь.

Nuweb

Нет конечно некоторых плюшек sweave, но первоначально оно все создавалось для С.

Очень хорошо статистику различную через отчеты прогонять. Сделал себе шаблон и только данные подгружай и картинки подправляй. Это лень 80го левела.

ErasimHolmogorin ()
Ответ на: комментарий от pseudo-cat

Магия начинается тогда, когда начинаешь использовать ggplot2 или lattice, графики моментально появляются там, где они необходимы.

ErasimHolmogorin ()
Ответ на: комментарий от ErasimHolmogorin

Сделал себе шаблон и только данные подгружай и картинки подправляй.

Годится лишь для совершенно однотипных задач. Я в таком случае пользуюсь башегенератором и шаблоном в латехе.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

Я в таком случае пользуюсь башегенератором и шаблоном в латехе.

Велосипедостроение.

Годится лишь для совершенно однотипных задач.

Да, задачи однотипные, но занимаясь написанием отчета, приходится делать очень много однотипных задач и большинство этих задач спокойно съедает Sweave. Стоимость ошибки в данном случае низкая и нет необходимости следить за актуальностью информации, потому что информация в отчете всегда актуальна.

ErasimHolmogorin ()
Ответ на: комментарий от ErasimHolmogorin

Велосипедостроение

Зато свое, родное и понятное.

Eddy_Em ☆☆☆☆☆ ()

Хотел было ответить, но дальше

boost

читать не смог

buddhist ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.