Pull to refresh

Comments 11

Красиво. Как в плагинах Винампа 20 лет назад ;)
Читаю в вашем ридми —
Для возможности поддержки моделей, которые не интегрированы в приложение, реализован парсер математических уравнений, который поддерживает стандартные операции (+ — * /), скобки и основные математические функции (sin, cos, exp, log и т.д.).



И судя по коду вы написали-таки парсер из строки в некий промежуточный байт-код, который по сути потом интерпретируете на каждом шаге и им считаете, так?

Тут есть хинт — но надо понимать, что он нужен, когда вы хотите, чтобы считалось быстро, и не собираетесь гарантировать безопасность — можно формулы, введенные юзером, воткнуть в c++ файлик, его откомпилировать и dlopen-ом подгрузить :)

И еще, про промежуточные точки и численный метод — я не проверял, но что-то мне подсказывает, что из вашего Рунге-Кутты четвертого порядка можно выудить промежуточные точки, по которым оно считает. Или можно первые три-четыре шага делать Рунге-Куттой, а потом считать по схеме Адамса 4-го порядка с более подробным шагом. По вычислениям и точности там тож-на-тож, а точек он даст поболее — возможно будет лучше смотреться.
Тут есть хинт — но надо понимать, что он нужен, когда вы хотите, чтобы считалось быстро, и не собираетесь гарантировать безопасность — можно формулы, введенные юзером, воткнуть в c++ файлик, его откомпилировать и dlopen-ом подгрузить :)

Сначала одни решат, что локально испольнение случайного кода не так уж и страшно. Потом кто-то другой решит сделать веб сервис на основе этого приложения. И вот вам уже готовая RCE :)
Мы думали над вариантом с dlopen, но нам показалось, что это слишком не безопасно и не кроссплатформенно. Поэтому вариант с JIT-компиляцией с помощью LLVM нам показался более интересным, правда более сложным, поэтому реализовать это не успели.

Над более хорошими методами мы думали, в том числе и над методом Адамаса, но также не успели их добавить. Хотя это не сложно ибо если хорошо подключить Boost.Numeric.Odeint, то там сразу много методов появляется, среди них и метод Адамаса. А с рассчитыванием большего количества точек может быть проблема в виде потребляемой памяти и ресурсов видеокарты, но мы это, вроде, не пробовали ибо не было метода, который бы мог давать такой результат при не очень большом времени ожидани.
Кайф, я считаю, что место таким визуализациям в… музеях, чтобы под резной рамой был качественный монитор, на котором бы воспроизводилась анимация. Когда-нибудь мы будем обществом, способным ценить такое не только в среде гиков.
При реализации моделирования мы решили использовать метапрограммирование, отказавшись от std::function и других подобных механик.

Я вот этот момент не очень понял. Метапрограммирование в текущих плюсах устроено при помощи шаблонов и std::function один из таких шаблонов, да и в коде там встречаются. Так от чего отказались в итоге, да так что еще и прирост к производительности получили?

std::function используется в обёртках, чтобы пробрасывать и захватывать функторы и структуры разных типов. Она вызывается один раз для каждой серии точек, что минимально сказывается на производительности. А вот в самих функциях, где основной цикл последовательного вычисления точек, тип функтора является параметром шаблона, что даёт компилятору простор для оптимизаций под каждый из них, как самый простой пример — оптимизация виртуального вызова. Я пытался замерять разницу с тем, чтобы передавать туда просто std::function и этот вариант проигрывает сильно (от 20% до 300% на разных системах)
Спасибо большое! Трудно найти людей вокруг себя которые бы могли оценить красоту этого по настоящему. Я помню как лет 11 назад профессор по физике нам на лекции рассказывал про хаос, схему чуа, аттракторы, а я не мог понять что он в этом находит, что так восхищенно об этом говорит. Я оставлю это здесь, на случай, если кто то не понимает почему это все очень красиво.
www.youtube.com/watch?v=Ee9yBJ6C8u4&ab_channel=VertDider Хаос. Эффект бабочки и проблема трёх тел [Veritasium]
www.youtube.com/watch?v=DH1cv0Rdf2w&t=23s&ab_channel=VertDider Уравнение, которое меняет взгляд на мир [Veritasium]
www.youtube.com/watch?v=MqtnpcdvxaI&ab_channel=VertDider Биология поведения человека: Лекция #21. Хаос и редукционизм [Роберт Сапольски, 2010. Стэнфорд] Стэнфорд]
www.youtube.com/watch?v=ScKNmdoY2bE&ab_channel=VertDider Биология поведения человека: Лекция #22. Эмерджентность и сложность [Роберт Сапольски.
www.youtube.com/watch?v=5cqh3LeOuOs В поисках единства (Леннаучфильм)

P.S. Биологию поведения вообще нужно всю посмотреть каждому человеку.
Яростно поддерживаю точку зрения данного джентельмена. От себя хочу добавить схему, реализующую модель аттрактора в качестве приставки к осциллографу:



Не понимаю почему но меня такие штуки привлекают в первую очередь с эстетической стороны. Кажется, словно это какой-то артефакт в котором заключена красивая математическая концепция.
Очень здорово!
В качестве решения для пользовательских систем могу предложить использовать LLVM IR.
Вот тут неплохой гайд по построению своего игрушечного языка.
Основная идея — в рантайме парсить исходный код системы, строить AST, по нему генерировать команды LLVM ассемблера и потом это компилировать в машинный код для текущей платформы. На выходе — указатель на функцию, которую можно просто вызвать. Бонусом идут все оптимизации, доступные в LLVM.
Недавно использовал в рабочем проекте — впечатления сугубо положительные, всё довольно просто, понятно и логично.
Sign up to leave a comment.