Optimización código del POST
This commit is contained in:
+26
-32
@@ -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))}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user