diff --git a/src/main/java/ru/ulstu/fc/rule/service/FuzzyRuleParseService.java b/src/main/java/ru/ulstu/fc/rule/service/FuzzyRuleParseService.java index 1dc0c5b..fc730a4 100644 --- a/src/main/java/ru/ulstu/fc/rule/service/FuzzyRuleParseService.java +++ b/src/main/java/ru/ulstu/fc/rule/service/FuzzyRuleParseService.java @@ -27,6 +27,8 @@ public class FuzzyRuleParseService { private final static String RU_IS_STATEMENT = "является"; private final static String RU_EQ_STATEMENT = "равно"; private final static String ENG_IS_STATEMENT = "is"; + private final static String INPUT_VARIABLE_TEMPLATE_NAME = "fuzzyLevel"; + private final static String OUTPUT_VARIABLE_TEMPLATE_NAME = "outputFuzzyLevel"; private final Engine fuzzyEngine; private final VariableService variableService; @@ -98,35 +100,54 @@ public class FuzzyRuleParseService { variableService.clearVariables(projectId); fuzzyRuleService.clearRules(projectId); - final String variableName = "fuzzyLevel"; - Variable variable = new Variable(); - variable.setName(variableName); - variable = variableService.save(variable, projectId); - - List uniqueTerms = new HashSet<>(Arrays.stream(fuzzyRuleDataDto.getFuzzyTerms()).toList()).stream().toList(); - for (int i = 0; i < uniqueTerms.size(); i++) { - fuzzyTermService.save(new FuzzyTermForm(projectId, variable.getId(), uniqueTerms.get(i), Double.valueOf(i))); - } - - //save rules - int current = 0; + createVariables(fuzzyRuleDataDto, projectId); + int ruleStartPos = 0; List terms = Arrays.stream(fuzzyRuleDataDto.getFuzzyTerms()).toList(); - while (current + fuzzyRuleDataDto.getWindow() < terms.size() - 1) { + while (ruleStartPos + fuzzyRuleDataDto.getWindow() < terms.size()) { StringBuilder stringRule = new StringBuilder("if "); - int start = current; - for (int i = start; i < fuzzyRuleDataDto.getWindow(); i++) { - if (i > start) { + int antecedentStartPos = ruleStartPos; + int variableNum = 0; + int i = antecedentStartPos; + while (i < fuzzyRuleDataDto.getWindow() + antecedentStartPos) { + if (i > antecedentStartPos) { stringRule.append(" and "); } - stringRule.append(variableName + " is ").append(terms.get(i)); + stringRule + .append(INPUT_VARIABLE_TEMPLATE_NAME) + .append(variableNum) + .append(" is ") + .append(terms.get(i)); + variableNum++; + i++; } stringRule - .append(" then ").append(variableName).append(" is ") - .append(terms.get(current + fuzzyRuleDataDto.getWindow())); - current++; + .append(" then ").append(OUTPUT_VARIABLE_TEMPLATE_NAME) + .append(" is ") + .append(terms.get(ruleStartPos + fuzzyRuleDataDto.getWindow())); + ruleStartPos++; FuzzyRuleDto fuzzyRule = new FuzzyRuleDto(projectId, stringRule.toString()); fuzzyRuleService.save(fuzzyRule); } } + + private void createVariables(FuzzyRuleDataDto fuzzyRuleDataDto, Integer projectId) { + List uniqueTerms = new HashSet<>(Arrays.stream(fuzzyRuleDataDto.getFuzzyTerms()).toList()).stream().toList(); + + for (int i = 0; i < fuzzyRuleDataDto.getWindow(); i++) { + createVariable(INPUT_VARIABLE_TEMPLATE_NAME + i, true, projectId, uniqueTerms); + } + + createVariable(OUTPUT_VARIABLE_TEMPLATE_NAME, false, projectId, uniqueTerms); + } + + private void createVariable(String variableName, boolean isInput, Integer projectId, List uniqueTerms) { + Variable variable = new Variable(); + variable.setName(variableName); + variable.setInput(isInput); + variable = variableService.save(variable, projectId); + for (int j = 0; j < uniqueTerms.size(); j++) { + fuzzyTermService.save(new FuzzyTermForm(projectId, variable.getId(), uniqueTerms.get(j), Double.valueOf(j))); + } + } }