#74 -- recommendations without time series data

This commit is contained in:
Anton Romanov 2022-10-25 16:26:54 +04:00
parent 591f183e8b
commit 81bcc89096
2 changed files with 28 additions and 21 deletions

View File

@ -11,12 +11,9 @@ import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.NoHandlerFoundException; import org.springframework.web.servlet.NoHandlerFoundException;
import springfox.documentation.annotations.ApiIgnore; import springfox.documentation.annotations.ApiIgnore;
import javax.servlet.http.HttpServletRequest;
@ControllerAdvice @ControllerAdvice
@ApiIgnore @ApiIgnore
class GlobalDefaultExceptionHandler { class GlobalDefaultExceptionHandler {
@ -24,15 +21,15 @@ class GlobalDefaultExceptionHandler {
public static final String DEFAULT_ERROR_VIEW = "error"; public static final String DEFAULT_ERROR_VIEW = "error";
@ExceptionHandler(value = Exception.class) // @ExceptionHandler(value = Exception.class)
public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) { // public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) {
LOG.warn(e.getMessage()); // LOG.warn(e.getMessage());
ModelAndView mav = new ModelAndView(); // ModelAndView mav = new ModelAndView();
mav.addObject("exception", e); // mav.addObject("exception", e);
mav.addObject("url", req.getRequestURL()); // mav.addObject("url", req.getRequestURL());
mav.setViewName(DEFAULT_ERROR_VIEW); // mav.setViewName(DEFAULT_ERROR_VIEW);
return mav; // return mav;
} // }
@ExceptionHandler(NoHandlerFoundException.class) @ExceptionHandler(NoHandlerFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND) @ResponseStatus(HttpStatus.NOT_FOUND)

View File

@ -2,6 +2,9 @@ package ru.ulstu.extractor.rule.service;
import com.fuzzylite.Engine; import com.fuzzylite.Engine;
import com.fuzzylite.activation.Highest; import com.fuzzylite.activation.Highest;
import com.fuzzylite.defuzzifier.Centroid;
import com.fuzzylite.norm.s.BoundedSum;
import com.fuzzylite.norm.s.Maximum;
import com.fuzzylite.norm.t.AlgebraicProduct; import com.fuzzylite.norm.t.AlgebraicProduct;
import com.fuzzylite.rule.Rule; import com.fuzzylite.rule.Rule;
import com.fuzzylite.rule.RuleBlock; import com.fuzzylite.rule.RuleBlock;
@ -52,10 +55,10 @@ public class FuzzyInferenceService {
input.setName(key); input.setName(key);
input.setDescription(""); input.setDescription("");
input.setEnabled(true); input.setEnabled(true);
input.setRange(0.000, antecedentValues.size() + 1); input.setRange(-0.1, antecedentValues.size() + 1.1);
input.setLockValueInRange(false); input.setLockValueInRange(false);
for (int i = 0; i < antecedentValues.size(); i++) { for (int i = 0; i < antecedentValues.size(); i++) {
input.addTerm(new Triangle(antecedentValues.get(i).getAntecedentValue(), i, i + 2)); input.addTerm(new Triangle(antecedentValues.get(i).getAntecedentValue(), i - 0.1, i + 2.1));
} }
engine.addInputVariable(input); engine.addInputVariable(input);
}); });
@ -64,10 +67,13 @@ public class FuzzyInferenceService {
output.setName(OUTPUT_VARIABLE_NAME); output.setName(OUTPUT_VARIABLE_NAME);
output.setDescription(""); output.setDescription("");
output.setEnabled(true); output.setEnabled(true);
output.setRange(0.000, antecedentValues.size() + 1); output.setRange(-0.1, antecedentValues.size() + 0.1);
output.setAggregation(new Maximum());
output.setDefuzzifier(new Centroid(100));
output.setDefaultValue(Double.NaN);
output.setLockValueInRange(false); output.setLockValueInRange(false);
for (int i = 0; i < antecedentValues.size(); i++) { for (int i = 0; i < antecedentValues.size(); i++) {
output.addTerm(new Triangle(antecedentValues.get(i).getAntecedentValue(), i, i + 2)); output.addTerm(new Triangle(antecedentValues.get(i).getAntecedentValue(), i - 0.1, i + 2.1));
} }
engine.addOutputVariable(output); engine.addOutputVariable(output);
@ -75,8 +81,8 @@ public class FuzzyInferenceService {
mamdani.setName("mamdani"); mamdani.setName("mamdani");
mamdani.setDescription(""); mamdani.setDescription("");
mamdani.setEnabled(true); mamdani.setEnabled(true);
mamdani.setConjunction(null); mamdani.setConjunction(new AlgebraicProduct());
mamdani.setDisjunction(null); mamdani.setDisjunction(new BoundedSum());
mamdani.setImplication(new AlgebraicProduct()); mamdani.setImplication(new AlgebraicProduct());
mamdani.setActivation(new Highest()); mamdani.setActivation(new Highest());
getRulesFromDb().forEach(r -> mamdani.addRule(Rule.parse(r, engine))); getRulesFromDb().forEach(r -> mamdani.addRule(Rule.parse(r, engine)));
@ -94,8 +100,8 @@ public class FuzzyInferenceService {
Engine engine = getFuzzyEngine(); Engine engine = getFuzzyEngine();
List<AntecedentValue> antecedentValues = antecedentValueService.getList(); List<AntecedentValue> antecedentValues = antecedentValueService.getList();
Map<String, Double> variableValues = new HashMap<>(); Map<String, Double> variableValues = new HashMap<>();
variableValues.put("COMMITS", 10.0); variableValues.put("COMMITS", 0.0);
variableValues.put("AUTHORS", 10.0); variableValues.put("AUTHORS", 0.0);
engine.addRuleBlock(getRuleBlock(engine, variableValues, antecedentValues)); engine.addRuleBlock(getRuleBlock(engine, variableValues, antecedentValues));
return getConsequent(engine, variableValues); return getConsequent(engine, variableValues);
} }
@ -107,6 +113,10 @@ public class FuzzyInferenceService {
inputVariable.setValue(variableValue.getValue()); inputVariable.setValue(variableValue.getValue());
} }
engine.process(); engine.process();
return outputVariable == null ? "" : outputVariable.fuzzyOutputValue(); if (outputVariable != null) {
outputVariable.defuzzify();
}
return outputVariable == null ? "" : outputVariable.highestMembership(outputVariable.getValue()).getSecond().getName();
//return outputVariable == null ? "" : outputVariable.fuzzyOutputValue();
} }
} }