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:
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user