Библиотека оценки Java-формула с функцией переменных вне порядка

В настоящее время я ищу библиотеку java (или собственную библиотеку с API Java) для разбора и оценки формул.

Используя рекомендации здесь, я просмотрел многие библиотеки:

  • JFormula
  • JEval
  • Symja
  • СЭП

Но никто из них не выполняет мои потребности, а именно:

  • Множественная оценка формулы с зависимостью между ними (формула всегда относится к переменной с использованием других переменных или числовых значений)
  • Возможность изменить только одну формулу из, возможно, 50, с хорошими характеристиками, если изменяется только одна формала
  • Не нужно обрабатывать зависимость переменных вручную
  • Автоматическое обновление других зависимых переменных, если изменяется формула
  • Возможность прослушивания измененной переменной
  • не нужно иметь определенный формат для переменных (пользователь будет напрямую вводить имя и не хочет иметь сложную нотацию)

Может быть, пример будет лучше. Пусть говорят, что мы вошли в систему в следующем порядке:

  • a = b + c
  • c = 2 * d
  • b = 3
  • d = 2

Я хотел бы иметь возможность вводить эти 4 строки в этом порядке и запрашивать результат "a" (или "b" , что угодно). Тогда, если в пользовательском интерфейсе (в основном, табличная переменная < > formula) значение "b" изменено на "2 * d", библиотека автоматически изменит значение "b" и "a" и вернет меня (или обед событие или вызов функции) список изменений

Лучшая библиотека будет такой же, как JEP, но с возможностями переменных вне порядка и возможностью автоматической оценки зависимых переменных

Я знаю, что компиляторы и электронные таблицы используют такие механизмы, но я не нашел java или java-совместимые библиотеки, которые можно использовать непосредственно

Кто-нибудь знает кого-то?

EDIT: Точность: вопрос действительно о библиотеке, или, в конечном счете, о наборе библиотек для связи. Вопрос заключается в проекте в компании, и идея состоит в том, чтобы потратить минимальное время. Решение "сделай сам" уже оценено и не входит в круг вопросов.

Ответ 1

Для проекта, в котором мне также нужен простой синтаксический анализатор формул, я использовал код статьи Лексический анализ, часть 2: Создание приложения в javaworld.com. Это простой и маленький (7 классов), и вы можете адаптировать его к вашим потребностям.

Вы можете загрузить исходную форму здесь (найдите запись "Лексический анализ Часть II" ).

Ответ 2

Не знаю никаких библиотек.

Предполагая, что у вас есть набор уравнений с одной переменной на хотя бы одной стороне уравнения (A + B = CD запрещен) и нет циклов (например, A = B + 1; B = A- 2), то, что вам технически необходимо сделать, - это построить график потока данных, показывающий, как каждый оператор зависит от его операндов. Для уравнений без побочных эффектов (например, чистой математики) это довольно легко; вы получаете ориентированный ациклический граф (лес с разделяемыми поддеревьями, представляющими общие подвыражения). Затем, если изменяется значение переменной или вводится новая формула, вы пересматриваете dag и переоцениваете измененные части, распространяя изменения до дага на корни dag. Итак, вам нужно построить деревья для выражений, а затем поделиться ими (часто путем хэширования поддеревьев, чтобы найти потенциальных эквивалентных кандидатов). Таким образом, много структурных манипуляций, чтобы сохранить dag (и является корневыми значениями)

Но если его всего лишь 50 переменных сложности, которые вы показываете, это будет действовать, вы можете просто переоценить их все. Если вы сохраните выражение в виде деревьев (или, еще лучше, обратный полиш), вы можете оценить каждое дерево довольно быстро, и вы не платите никаких накладных расходов, чтобы обновлять все эти структуры данных.

Если у вас есть сотни уравнений, схема dag, вероятно, намного лучше.

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

Ответ 3

Почему бы вам просто не написать свой собственный? Ваша оценка сложности этой задачи может быть неправильной. Это намного проще, чем вы могли подумать - скорее всего, научиться обращаться с какой-либо сторонней библиотекой потребует гораздо больших усилий, чем реализация такой тривиальной вещи с нуля. Это не должно занимать больше двух часов в худшем случае.

Нет смысла искать сторонние библиотеки для выполнения простых вещей (я знаю, что это часть этака Java, но все же...)

Я бы рекомендовал ознакомиться с библиотекой Cells для вдохновения. Он находится в Common Lisp, но идеи достаточно базовы, чтобы их можно было переносить где-нибудь еще.

Ответ 5

Я бы вложил Groovy, см. Учебник о вложении здесь. Freeplane (Java Mindmapper) также использует Groovy для формул.

Всякий раз, когда переменная меняется, вы должны поместить новое значение в привязку. Весь код ячейки должен быть присвоен оболочке Groovy как единый фрагмент кода. Вы можете зарегистрироваться на изменениях через BindPath.

В любом случае я предполагаю, что вам нужно реализовать тонкий слой, чтобы полностью удовлетворить ваши требования:

  • Не нужно обрабатывать зависимость переменных вручную
  • Возможность прослушивания измененной переменной