Biblioteca de evaluación de fórmulas Java con función de variables fuera de orden

Actualmente estoy buscando una biblioteca de Java (o una biblioteca nativa con una API de Java) para analizar y evaluar fórmulas.

Utilizando las recomendaciones de aquí, eché un vistazo a muchas bibliotecas:

  • JFormula
  • JEval
  • Symja
  • JEP

Pero ninguno de ellos satisface mis necesidades, que son:

  • Evaluación de fórmulas múltiples con dependencia entre ellas (una fórmula siempre es una afectación a una variable usando otras variables o valores numéricos)
  • Posibilidad de cambiar solo una fórmula de quizás 50, con un buen desempeño si solo cambia una fórmula
  • no es necesario manejar a mano las dependencias de las variables
  • Actualice automáticamente otras variables dependientes si cambia una fórmula
  • Posibilidad de escuchar qué variable cambió
  • no es necesario tener un formato específico para las variables (el usuario ingresará directamente un nombre y no desea tener una notación compleja)

Quizás un ejemplo sea mejor. Digamos que hemos ingresado en el sistema en este orden:

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

Me gustaría poder ingresar esas 4 líneas en este orden, y pedir el resultado de "a" (o "b", lo que sea). Luego, si en la interfaz de usuario (básicamente una variable de tabla <> fórmula) "b" se cambia a "2 * d", la biblioteca cambiará automáticamente el valor de "b" y "a", y me devolverá (o almorzará un evento o llamar a una función) una lista de cambios

La mejor biblioteca sería una como JEP, pero con la capacidad de variables fuera de orden y la posibilidad de evaluar automáticamente las variables dependientes

Sé que los compiladores y los softwares de hoja de cálculo utilizan tales mecanismos, pero no encontré ninguna biblioteca compatible con Java o Java directamente utilizable

¿Alguien sabe uno?

EDITAR: Precisión: la pregunta es realmente sobre una biblioteca, o eventualmente un conjunto de bibliotecas para vincular. La pregunta es para un proyecto en una empresa y la idea es pasar la mínima cantidad de tiempo. La solución "hágalo usted mismo" ya se ha estimado y no está dentro del alcance de la pregunta.

Respuesta 1

Para un proyecto en el que también necesitaba un analizador de fórmulas simple, utilicé el código del artículo Análisis léxico, Parte 2: Crear una aplicación en javaworld.com. Es simple y pequeño (7 clases), y puede adaptarlo a sus necesidades.

Puede descargar el formulario de origen aquí (busque la entrada 'Lexical Analysis Part II').

Respuesta: 2

No conozco ninguna biblioteca.

Suponiendo que lo que tiene es un conjunto de ecuaciones con una sola variable en al menos un lado de la ecuación (A + B = CD no está permitido) y nociclos (por ejemplo, A = B + 1; B = A-2), lo que técnicamente necesita hacer es construir un gráfico de flujo de datos que muestre cómo cada operador depende de sus operandos. Para las ecuaciones sin efectos secundarios (por ejemplo, matemática pura) esto es bastante fácil; terminas con un gráfico acíclico dirigido (un bosque con subárboles compartidos que representan subexpresiones compartidas). Luego, si se cambia el valor de una variable, o si se introduce una nueva fórmula, usted revisa el dag y vuelve a evaluar las partes cambiadas, propagando los cambios hacia arriba hasta las raíces de dag. Por lo tanto, debe construir árboles para las expresiones y luego compartirlas (a menudo haciendo hash en subárboles para encontrar posibles candidatos equivalentes). Entonces, mucha manipulación de la estructura para mantener el dag (y sus valores raíz)

Pero si solo actuaran 50 variables de la complejidad que muestra, actuaría, simplemente podría reevaluarlas todas. Si almacena la expresión como árboles (o mejor aún, pulido inverso) puede evaluar cada árbol bastante rápido, y no paga ningún gasto para mantener todas esas estructuras de datos actualizadas.

Si tiene cientos de ecuaciones, el esquema de dag probablemente sea mucho mejor.

Si tiene ecuaciones de restricción (por ejemplo, no está restringido en cuanto a lo que puede estar en ambos lados), está fuera del paradigma de la hoja de cálculo y en los solucionadores de restricciones, que es una tecnología mucho más compleja.

Respuesta: 3

puedes consultar estos enlaces también ...

Respuesta: 4

Tengo la siguiente interfaz: public interface ClusterPopulation {public double computeDistance (ClusterPopulation other); } ¿Es posible especificar dentro de la interfaz misma, que ...

No puedo obtener el nombre del grupo bajo el cual se almacena el contacto. Puedo saber si se agrega en cualquier grupo como valor booleano (IN_VISIBLE_GROUP). No tengo idea de cómo obtener el nombre o id del grupo. ...

Después de una actualización de Hibernate 3 a 4, estamos trabajando en algunos problemas que aparecieron en el camino. Uno que nos tiene particularmente perplejos es una UnsupportedOperationException, donde un ...

Tengo clases de árbol, por ejemplo, ClassA, ClassB, ClassC. ClassA y ClassB extiende ClassC. Tengo dos Multimaps: Multimap <Integer, ClassA> y Multimap <Integer, ClassB> y me gustaría fusionar ...