From de63be301463e91b64cf348f4498fb78d7667316 Mon Sep 17 00:00:00 2001 From: Anton Romanov Date: Thu, 20 Mar 2025 14:47:30 +0400 Subject: [PATCH] #31 -- Add horizon for inference --- .../fc/rule/model/dto/FuzzyRuleDataDto.java | 9 ++++ .../rule/service/FuzzyInferenceService.java | 46 +++++++++++++------ 2 files changed, 42 insertions(+), 13 deletions(-) diff --git a/src/main/java/ru/ulstu/fc/rule/model/dto/FuzzyRuleDataDto.java b/src/main/java/ru/ulstu/fc/rule/model/dto/FuzzyRuleDataDto.java index 7f48c9a..d0ee05d 100644 --- a/src/main/java/ru/ulstu/fc/rule/model/dto/FuzzyRuleDataDto.java +++ b/src/main/java/ru/ulstu/fc/rule/model/dto/FuzzyRuleDataDto.java @@ -3,6 +3,7 @@ package ru.ulstu.fc.rule.model.dto; public class FuzzyRuleDataDto { private String[] fuzzyTerms; private int window = 3; + private int horizon = 1; public String[] getFuzzyTerms() { return fuzzyTerms; @@ -19,4 +20,12 @@ public class FuzzyRuleDataDto { public void setWindow(int window) { this.window = window; } + + public int getHorizon() { + return horizon; + } + + public void setHorizon(int horizon) { + this.horizon = horizon; + } } diff --git a/src/main/java/ru/ulstu/fc/rule/service/FuzzyInferenceService.java b/src/main/java/ru/ulstu/fc/rule/service/FuzzyInferenceService.java index 811818d..64df0a2 100644 --- a/src/main/java/ru/ulstu/fc/rule/service/FuzzyInferenceService.java +++ b/src/main/java/ru/ulstu/fc/rule/service/FuzzyInferenceService.java @@ -24,6 +24,7 @@ import ru.ulstu.fc.rule.model.Variable; import ru.ulstu.fc.rule.model.dto.FuzzyRuleDataDto; import ru.ulstu.fc.rule.model.dto.VariableValueDto; +import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.Date; @@ -216,19 +217,38 @@ public class FuzzyInferenceService { ProjectDto projectDto = projectService.save(new ProjectDto(new Date().toString())); fuzzyRuleParseService.generateRules(projectDto.getId(), fuzzyRuleDataDto); Map variableValues = new HashMap<>(); - List labels = new LinkedList<>(Arrays.asList(fuzzyRuleDataDto.getFuzzyTerms())); - while (labels.size() > fuzzyRuleDataDto.getWindow()) { - labels.removeFirst(); + + List result = new ArrayList<>(); + for (int h = 0; h < fuzzyRuleDataDto.getHorizon(); h++) { + List labels = new LinkedList<>(Arrays.asList(fuzzyRuleDataDto.getFuzzyTerms())); + labels.addAll(result.stream().map(OutputValue::getFuzzyTerm).toList()); + + while (labels.size() > fuzzyRuleDataDto.getWindow()) { + labels.removeFirst(); + } + for (int i = 0; i < labels.size(); i++) { + String label = labels.get(i); + variableValues.put("fuzzyLevel" + i, + variableService.getByProjectAndName(projectDto.getId(), "fuzzyLevel" + i) + .getFuzzyTerms() + .stream() + .filter(ft -> ft.getDescription().equals(label)) + .mapToDouble(FuzzyTerm::getCrispValue).findAny().getAsDouble()); + } + List onePointResult = getProjectFuzzyInference(projectDto.getId(), variableValues); + if (onePointResult.isEmpty()) { + onePointResult = new ArrayList<>(); + if (result.isEmpty()) { + onePointResult.add( + new OutputValue("someVar", + fuzzyRuleDataDto.getFuzzyTerms()[fuzzyRuleDataDto.getFuzzyTerms().length - 1], + 1.0)); + } else { + onePointResult.add(result.getLast()); + } + } + result.add(onePointResult.getFirst()); } - for (int i = 0; i < labels.size(); i++) { - String label = labels.get(i); - variableValues.put("fuzzyLevel" + i, - variableService.getByProjectAndName(projectDto.getId(), "fuzzyLevel" + i) - .getFuzzyTerms() - .stream() - .filter(ft -> ft.getDescription().equals(label)) - .mapToDouble(FuzzyTerm::getCrispValue).findAny().getAsDouble()); - } - return getProjectFuzzyInference(projectDto.getId(), variableValues); + return result; } } \ No newline at end of file