Optimización código del POST

This commit is contained in:
Mireya Cueto Garrido
2026-03-23 11:16:37 +01:00
parent 113c20204d
commit 7deda89ad0
+26 -32
View File
@@ -4,57 +4,51 @@ from typing import List, Dict
app = FastAPI() app = FastAPI()
# 1. Definimos el modelo de datos basado en el JSON que se enviará desde el frontend
class ValueFunctionRequest(BaseModel): class ValueFunctionRequest(BaseModel):
criterion_name: str criterion_name: str
levels: List[str] levels: List[str]
blank_cards: List[int] blank_cards: List[int]
references: Dict[str, float] references: Dict[str, float]
# Ruta prueba para probar que todo funciona
@app.get("/prueba") @app.get("/prueba")
def ruta_de_prueba(): def prueba():
return {"mensaje": "¡Hola desde FastAPI! El contenedor de docker está funcionando"} return {"mensaje": "¡Hola desde FastAPI! El contenedor de docker está funcionando"}
# 2. Endpoint POST para recibir los datos y calcular los valores
@app.post("/api/criteria/doc/value-function") @app.post("/api/criteria/doc/value-function")
def calcular_funcion_valor(request: ValueFunctionRequest): def calcular(request: ValueFunctionRequest):
levels = request.levels levels = request.levels
blank_cards = request.blank_cards cards_between_levels = request.blank_cards
refs = request.references reference_values = request.references
# Extraemos las claves de referencia y las convertimos a enteros # Índices de referencia (por ejemplo 0 y 4)
claves_ref = sorted(int(k) for k in refs.keys()) # ejemplo: [0, 4] ref_indices = sorted(int(k) for k in reference_values)
p, q = claves_ref # p = 0, q = 4 lower_ref, upper_ref = ref_indices
# Valores de referencia # Valores asignados a esas referencias
up = refs[str(p)] lower_value = reference_values[str(lower_ref)]
uq = refs[str(q)] upper_value = reference_values[str(upper_ref)]
# PASO A: Calculamos el número total de unidades elementales 'h' entre p y q # Total de unidades entre las referencias
h = sum(blank_cards[r] + 1 for r in range(p, q)) total_units = sum(cards_between_levels[i] + 1 for i in range(lower_ref, upper_ref))
# PASO B: Calculamos el valor fraccional de una sola unidad 'alpha' # Valor por unidad
alpha = (uq - up) / h if h != 0 else 0 unit_value = (upper_value - lower_value) / total_units if total_units else 0
# Inicializamos la lista de valores V con el tamaño de los niveles # Lista de valores finales
V = [0.0] * len(levels) values = [0] * len(levels)
V[p] = up values[lower_ref] = lower_value
# PASO C: Calculamos los valores hacia adelante (niveles por encima de p) # Hacia arriba
for i in range(p + 1, len(levels)): for i in range(lower_ref + 1, len(levels)):
suma_unidades = sum(blank_cards[r] + 1 for r in range(p, i)) units = sum(cards_between_levels[r] + 1 for r in range(lower_ref, i))
V[i] = up + alpha * suma_unidades values[i] = lower_value + unit_value * units
# PASO D: Calculamos los valores hacia atrás (niveles por debajo de p) # Hacia abajo
for i in range(p - 1, -1, -1): for i in range(lower_ref - 1, -1, -1):
suma_unidades = sum(blank_cards[r] + 1 for r in range(i, p)) units = sum(cards_between_levels[r] + 1 for r in range(i, lower_ref))
V[i] = up - alpha * suma_unidades values[i] = lower_value - unit_value * units
# Formateamos la respuesta
resultado_valores = {levels[i]: round(V[i], 4) for i in range(len(levels))}
return { return {
"criterion_name": request.criterion_name, "criterion_name": request.criterion_name,
"values": resultado_valores "values": {levels[i]: round(values[i], 4) for i in range(len(levels))}
} }