Actualización del historial de cálculos con un nuevo formato de salario. Refactorización del motor algebraico para mejorar la gestión de ecuaciones y la resolución de variables, optimizando la salida de resultados y asegurando un manejo más eficiente de las soluciones simbólicas.

This commit is contained in:
Miguel 2025-06-12 11:09:04 +02:00
parent 639081c0d0
commit 01651fc454
2 changed files with 25 additions and 35 deletions

View File

@ -1,6 +1,6 @@
salario=horas*tarifa salario=horas*tarifa
salario=8000 salario=800
tarifa=36 tarifa=36
horas=? horas=?

View File

@ -552,18 +552,17 @@ class PureAlgebraicEngine:
return EvaluationResult(line, error_msg, "error", False, str(e)) return EvaluationResult(line, error_msg, "error", False, str(e))
def _smart_solve(self, *args, **kwargs): def _smart_solve(self, *args, **kwargs):
"""Función solve inteligente que usa nuestro sistema de ecuaciones""" """Función inteligente de resolución que maneja variables y valores"""
if not args: if len(args) == 1 and isinstance(args[0], (list, tuple)):
# solve() sin argumentos - resolver todo el sistema # solve([ecuaciones], [variables])
if not self.equations:
return "No hay ecuaciones en el sistema"
try: try:
all_vars = list(self.variables) if all(hasattr(eq, 'func') and eq.func.__name__ == 'Equality' for eq in args[0]):
solution = solve(self.equations, all_vars, dict=True) # Es una lista de ecuaciones
solutions = solve(args[0], **kwargs)
if solution: if solutions:
return solution[0] if len(solution) == 1 else solution return solutions
else:
return "Sin solución"
else: else:
return "Sin solución" return "Sin solución"
except Exception as e: except Exception as e:
@ -575,7 +574,7 @@ class PureAlgebraicEngine:
# Si encontramos una solución diferente de la variable # Si encontramos una solución diferente de la variable
if solution_value != var_symbol: if solution_value != var_symbol:
# Verificar si la solución contiene otras variables # Verificar si todas las variables libres tienen valores numéricos
free_symbols = solution_value.free_symbols free_symbols = solution_value.free_symbols
unresolved_vars = free_symbols - {var_symbol} unresolved_vars = free_symbols - {var_symbol}
@ -599,26 +598,18 @@ class PureAlgebraicEngine:
# Todas las variables tienen valores numéricos, resolver iterativamente # Todas las variables tienen valores numéricos, resolver iterativamente
final_value = self._resolve_iteratively(solution_value) final_value = self._resolve_iteratively(solution_value)
# Auto-aplicar la solución numérica al sistema # Verificar que el resultado no sea problemático
if final_value != var_symbol and not str(final_value) in ['True', 'False']: if final_value != var_symbol and not isinstance(final_value, (sp.logic.boolalg.BooleanTrue, sp.logic.boolalg.BooleanFalse)):
self._auto_apply_solution(var_symbol, final_value) return Eq(var_symbol, final_value)
else:
return Eq(var_symbol, final_value) # Si hay problema con la resolución, devolver simbólico
return Eq(var_symbol, solution_value)
else: else:
# Hay variables con valores simbólicos, intentar resolver lo máximo posible # Hay variables con valores simbólicos, devolver ecuación simbólica
# Aplicar resolución iterativa parcial return Eq(var_symbol, solution_value)
resolved_solution = self._resolve_iteratively(solution_value)
result_eq = Eq(var_symbol, resolved_solution)
return result_eq
else: else:
# No hay variables sin resolver, intentar resolver completamente # No hay variables sin resolver, es ya un valor final
final_value = self._resolve_iteratively(solution_value) return Eq(var_symbol, solution_value)
# Auto-aplicar la solución al sistema solo si es un valor específico
if final_value != var_symbol and not str(final_value) in ['True', 'False']:
self._auto_apply_solution(var_symbol, final_value)
return Eq(var_symbol, final_value)
else: else:
# Si no hay solución en las ecuaciones, verificar en symbol_table # Si no hay solución en las ecuaciones, verificar en symbol_table
var_name = str(var_symbol) var_name = str(var_symbol)
@ -626,11 +617,10 @@ class PureAlgebraicEngine:
value = self.symbol_table[var_name] value = self.symbol_table[var_name]
# Si el valor en symbol_table es diferente de la variable, devolverlo # Si el valor en symbol_table es diferente de la variable, devolverlo
if value != var_symbol: if value != var_symbol:
final_value = self._resolve_iteratively(value) return Eq(var_symbol, value)
return Eq(var_symbol, final_value)
# Si no hay información, devolver la variable tal como está # Si no hay información, devolver ecuación con la variable sin resolver
return var_symbol return Eq(var_symbol, var_symbol)
else: else:
# solve() con argumentos específicos (múltiples variables, ecuaciones, etc.) # solve() con argumentos específicos (múltiples variables, ecuaciones, etc.)
return solve(*args, **kwargs) return solve(*args, **kwargs)