Files
DoC/backend/api/services/docit2mf_build_service.py
T
2026-04-06 10:42:42 +02:00

62 lines
1.8 KiB
Python

# services/docit2mf_build_service.py
from typing import List, Union
from api.models.docit2mf_models import DoCIT2MFRequest
from api.models.docmf_models import DoCMFRequest
from api.services.docmf_build_service import build_doc_mf_level
def _extract_bounds(values: List[Union[int, List[int], tuple]], mode: str) -> List[int]:
"""
Devuelve una lista de enteros:
- Si el valor es un entero → se usa tal cual para LMF y UMF
- Si es un intervalo [min,max] → se usa min o max según mode
"""
result = []
for item in values:
if isinstance(item, int):
# valor fijo → mismo para LMF y UMF
result.append(item)
else:
lo, hi = item
result.append(lo if mode == "min" else hi)
return result
def build_it2mf_from_level(level: DoCIT2MFRequest):
# LMF (mínimos)
left_min = _extract_bounds(level.left_blank_cards, "min")
right_min = _extract_bounds(level.right_blank_cards, "min")
lower_level = DoCMFRequest(
term=level.term,
core=level.core,
support=level.support,
left_nodes_x=level.left_nodes_x,
left_blank_cards=left_min,
right_nodes_x=level.right_nodes_x,
right_blank_cards=right_min,
)
lower = build_doc_mf_level(lower_level)
# UMF (máximos)
left_max = _extract_bounds(level.left_blank_cards, "max")
right_max = _extract_bounds(level.right_blank_cards, "max")
upper_level = DoCMFRequest(
term=level.term,
core=level.core,
support=level.support,
left_nodes_x=level.left_nodes_x,
left_blank_cards=left_max,
right_nodes_x=level.right_nodes_x,
right_blank_cards=right_max,
)
upper = build_doc_mf_level(upper_level)
return {
"term": level.term,
"lower": lower,
"upper": upper
}