Añadida funcionalidad de intervalos en cartas blancas
This commit is contained in:
@@ -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
|
||||
}
|
||||
@@ -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"]],
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user