Как проще написать интерфейс для математических вычислений?
При разработке программ для математических вычислений пришёл к следующей задаче. Нужно задать входные данные для программы – числа, элементы перечислимых типов, векторы, матрицы, а также функции, которые будут вычисляться несколько раз внутри основной программы. (В обычном конфигурационном файле можно ввести значения переменных, но нельзя, скажем, ввести вместо значения выражение, которое должно посчитаться.) Вычислительные программы пишу на C++.
Какие программные средства можно использовать для решения этой задачи? Есть вариант писать скрипты на Python или Lua (или, возможно, Octave), в которых задаются входные данные и/или вызывается функция основной программы, но я не в курсе, можно ли в таком случае передать функцию в свою программу на C++, чтобы она быстро считалась. Или думаю разработать свой интерпретатор с универсальным парсером, который может пригодиться для разных форматов представления данных (хотя есть Boost.Spirit).
Подскажите, пожалуйста, как лучше автоматизировать ввод выражений, матриц и функций в свою программу.
Если нужна более конкретная постановка задачи - есть, скажем, нелинейное дифференциальное уравнение эллиптического типа -Δu + f(u) = g, где f, g - заданные функции. При решении такого уравнения нужно несколько раз вычислять значение функции f, которую нужно подать на вход моей программе.
Один из вариантов - написать программу на любом языке, которая принимает в качестве параметров аргументы функции и выводит в стандартный вывод значение функции - потом передать путь к программе и аргументы в качестве параметров конфигурационного файла и вызвать эту программу из основной программы. Но хочется иметь под рукой более удобный и универсальный интерфейс.
Может целесообразнее описывать функции f и g на том же C++ в отдельном файле и пересобирать исполняемый файл каждый раз под конкретную задачу, например с помощью скрипта
#/bin/bash
gcc -o $1 -lm -lstdc++ solver.o $1.cpp
./$1
где $1 -- аргумент скрипта -- имя файла с реализацией конкретных f и g без расширения
solver.o -- предварительно скомпилированное вычислительное ядро
Спасибо, это неплохой способ. Хотя не совсем то, что я хотел - мне хотелось бы предоставить пользователю более дружественный интерфейс. Может быть, попробую написать для этих целей свой транслятор.
Я такую же задачу решал так (и уравнение эллиптическое) - формула записывалась в программу на фортране, потом компилировалась и в виде разделяемой библиотеки присоединялась к программе. Никаких накладных расходов.
Если вы работаете с GPU, целесообразние и формулу считать на GPU
Запускать каждый раз отдельный процесс для вычисления одного числа - это будет стоить как крымский мост.
Самые быстрые способы по убыванию: программа для GPU, вычисление вектора значений от матрицы входных параметров, библиотека с реализацией нужной функции.
Что касается удобства - очевидно это зависит от постановки задачи, потому что универсальный вычислитель - это компилятор. Можно еще посмотреть на компиляцию кода во время работы (JIT), реализации есть для разных языков.