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:
parent
639081c0d0
commit
01651fc454
|
@ -1,6 +1,6 @@
|
||||||
|
|
||||||
salario=horas*tarifa
|
salario=horas*tarifa
|
||||||
salario=8000
|
salario=800
|
||||||
tarifa=36
|
tarifa=36
|
||||||
|
|
||||||
horas=?
|
horas=?
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue