Merge pull request #22 from AlexisLopez-Dev/feature/backend-v3

Añadida funcionalidad para ordenar nodos y garantizar que UMF no sea …
This commit is contained in:
Mireya Cueto Garrido
2026-04-09 13:19:07 +02:00
committed by GitHub
+52 -1
View File
@@ -15,7 +15,6 @@ def _extract_bounds(values: List[Union[int, List[int], tuple]], mode: str) -> Li
result = [] result = []
for item in values: for item in values:
if isinstance(item, int): if isinstance(item, int):
# valor fijo → mismo para LMF y UMF
result.append(item) result.append(item)
else: else:
lo, hi = item lo, hi = item
@@ -23,8 +22,45 @@ def _extract_bounds(values: List[Union[int, List[int], tuple]], mode: str) -> Li
return result return result
def _sort_nodes(nodes):
"""Ordena los nodos por su coordenada X."""
return sorted(nodes, key=lambda p: p[0])
def _enforce_upper_ge_lower(lower, upper):
"""
Garantiza que la UMF (upper) nunca quede por debajo de la LMF (lower).
Ajusta los valores de pertenencia si es necesario.
"""
# left nodes
for i in range(len(lower["left_nodes"])):
lx, ly = lower["left_nodes"][i]
ux, uy = upper["left_nodes"][i]
upper["left_nodes"][i][1] = max(uy, ly)
# right nodes
for i in range(len(lower["right_nodes"])):
lx, ly = lower["right_nodes"][i]
ux, uy = upper["right_nodes"][i]
upper["right_nodes"][i][1] = max(uy, ly)
return upper
def build_it2mf_from_level(level: DoCIT2MFRequest): def build_it2mf_from_level(level: DoCIT2MFRequest):
"""
Construye una función IT2MF a partir de un nivel con intervalos de cartas blancas.
Devuelve:
{
"term": ...,
"lower": {...},
"upper": {...}
}
"""
# -------------------------
# LMF (mínimos) # LMF (mínimos)
# -------------------------
left_min = _extract_bounds(level.left_blank_cards, "min") left_min = _extract_bounds(level.left_blank_cards, "min")
right_min = _extract_bounds(level.right_blank_cards, "min") right_min = _extract_bounds(level.right_blank_cards, "min")
@@ -39,7 +75,13 @@ def build_it2mf_from_level(level: DoCIT2MFRequest):
) )
lower = build_doc_mf_level(lower_level) lower = build_doc_mf_level(lower_level)
# Ordenar nodos LMF
lower["left_nodes"] = _sort_nodes(lower["left_nodes"])
lower["right_nodes"] = _sort_nodes(lower["right_nodes"])
# -------------------------
# UMF (máximos) # UMF (máximos)
# -------------------------
left_max = _extract_bounds(level.left_blank_cards, "max") left_max = _extract_bounds(level.left_blank_cards, "max")
right_max = _extract_bounds(level.right_blank_cards, "max") right_max = _extract_bounds(level.right_blank_cards, "max")
@@ -54,6 +96,15 @@ def build_it2mf_from_level(level: DoCIT2MFRequest):
) )
upper = build_doc_mf_level(upper_level) upper = build_doc_mf_level(upper_level)
# Ordenar nodos UMF
upper["left_nodes"] = _sort_nodes(upper["left_nodes"])
upper["right_nodes"] = _sort_nodes(upper["right_nodes"])
# -------------------------
# FIX: evitar inversión vertical (UMF < LMF)
# -------------------------
upper = _enforce_upper_ge_lower(lower, upper)
return { return {
"term": level.term, "term": level.term,
"lower": lower, "lower": lower,