Añadida funcionalidad de intervalos en cartas blancas

This commit is contained in:
Mireya Cueto Garrido
2026-04-06 10:42:42 +02:00
parent 111acc632e
commit 5d3de4e27f
8 changed files with 207 additions and 10 deletions
@@ -0,0 +1,61 @@
# 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
}
+25 -3
View File
@@ -1,4 +1,10 @@
def build_single_docmf(request):
# services/docmf_build_service.py
from api.models.docmf_models import DoCMFRequest
from api.models.user_models import FuzzyTerm
def build_single_docmf(request: DoCMFRequest):
a, b = request.core
c, d = request.support
@@ -12,7 +18,7 @@ def build_single_docmf(request):
if i == 0:
left_nodes.append((x, 0.0))
else:
acc += request.left_blank_cards[i-1] + 1
acc += request.left_blank_cards[i - 1] + 1
left_nodes.append((x, round(acc * YL, 4)))
# RIGHT
@@ -25,7 +31,7 @@ def build_single_docmf(request):
if i == 0:
right_nodes.append((x, 1.0))
else:
acc += request.right_blank_cards[i-1] + 1
acc += request.right_blank_cards[i - 1] + 1
right_nodes.append((x, round(1 - acc * YR, 4)))
return {
@@ -43,3 +49,19 @@ def build_docmf_multi(request):
result = build_single_docmf(level)
results.append(result)
return {"results": results}
def build_doc_mf_level(level: DoCMFRequest) -> FuzzyTerm:
"""
Adaptador para reutilizar build_single_docmf con el modelo DoCMFRequest.
Devuelve un FuzzyTerm, que es lo que espera el sistema IT2MF.
"""
result = build_single_docmf(level)
return FuzzyTerm(
term=result["term"],
core=list(result["core"]),
support=list(result["support"]),
left_nodes=[list(p) for p in result["left_nodes"]],
right_nodes=[list(p) for p in result["right_nodes"]],
)