From 77158d0be80b15f1968636a33777d7a40599203c Mon Sep 17 00:00:00 2001 From: Anton Romanov Date: Wed, 19 Mar 2025 11:22:22 +0400 Subject: [PATCH 1/7] #14 -- Add model --- .../ru/ulstu/method/fuzzy/PlainFuzzy.java | 58 +++++++++++++++++++ .../ulstu/method/fuzzy/PlainFuzzyModel.java | 52 +++++++++++++++++ .../java/ru/ulstu/method/fuzzy/Triangle.java | 51 ++++++++++++++++ .../fuzzy/parameter/NumberOfFuzzyTerms.java | 32 ++++++++++ 4 files changed, 193 insertions(+) create mode 100644 src/main/java/ru/ulstu/method/fuzzy/PlainFuzzy.java create mode 100644 src/main/java/ru/ulstu/method/fuzzy/PlainFuzzyModel.java create mode 100644 src/main/java/ru/ulstu/method/fuzzy/Triangle.java create mode 100644 src/main/java/ru/ulstu/method/fuzzy/parameter/NumberOfFuzzyTerms.java diff --git a/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzy.java b/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzy.java new file mode 100644 index 0000000..dfffabe --- /dev/null +++ b/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzy.java @@ -0,0 +1,58 @@ +package ru.ulstu.method.fuzzy; + +import ru.ulstu.datamodel.Model; +import ru.ulstu.datamodel.exception.ModelingException; +import ru.ulstu.datamodel.ts.TimeSeries; +import ru.ulstu.datamodel.ts.TimeSeriesValue; +import ru.ulstu.method.Method; +import ru.ulstu.method.MethodParamValue; +import ru.ulstu.method.MethodParameter; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +public class PlainFuzzy extends Method { + @Override + public List getAvailableParameters() { + return PlainFuzzyModel.getAvailableParameters(); + } + + @Override + protected Model getModelOfValidTimeSeries(TimeSeries timeSeries, List parameters) { + PlainFuzzyModel model = new PlainFuzzyModel(timeSeries, parameters); + List fuzzySets = generateFuzzySets(timeSeries, model.getNumberOfFuzzyTerms().getIntValue()); + return null; + } + + private List generateFuzzySets(TimeSeries timeSeries, Integer numberOfFuzzyTerms) { + List fuzzySets = new ArrayList(); + double min = timeSeries.getValues() + .stream() + .min(Comparator.comparing(TimeSeriesValue::getValue)) + .map(TimeSeriesValue::getValue) + .orElseThrow(() -> new RuntimeException("Минимальное значение не найдено")); + double max = timeSeries.getValues() + .stream() + .max(Comparator.comparing(TimeSeriesValue::getValue)) + .map(TimeSeriesValue::getValue) + .orElseThrow(() -> new RuntimeException("Максимальное значение не найдено")); + double delta = (max - min) / numberOfFuzzyTerms; + for (int i = 0; i < numberOfFuzzyTerms; i++) { + fuzzySets.add(new Triangle(min + i * numberOfFuzzyTerms, + min + i * numberOfFuzzyTerms + delta / 2, + min + i * numberOfFuzzyTerms + delta)); + } + return fuzzySets; + } + + @Override + protected TimeSeries getForecastWithValidParams(Model model, TimeSeries forecast) throws ModelingException { + return null; + } + + @Override + public String getName() { + return "Нечеткая модель"; + } +} diff --git a/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzyModel.java b/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzyModel.java new file mode 100644 index 0000000..686a6ca --- /dev/null +++ b/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzyModel.java @@ -0,0 +1,52 @@ +package ru.ulstu.method.fuzzy; + +import ru.ulstu.datamodel.Model; +import ru.ulstu.datamodel.ts.TimeSeries; +import ru.ulstu.method.MethodParamValue; +import ru.ulstu.method.MethodParameter; +import ru.ulstu.method.fuzzy.parameter.NumberOfFuzzyTerms; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class PlainFuzzyModel extends Model { + private final static String PREFIX_OF_FUZZY_LABEL = "X"; + private final MethodParamValue numberOfFuzzyTerms = new MethodParamValue(NumberOfFuzzyTerms.getInstance(), 2); + private List fuzzyTimeSeries = new ArrayList<>(); + private TimeSeries defuzzyfiedTimeSeries; + + protected PlainFuzzyModel(TimeSeries ts, List parameters) { + super(ts); + defuzzyfiedTimeSeries = new TimeSeries("Defuzzified time series of ", ts.getKey()); + for (MethodParamValue parameter : parameters) { + if (parameter.getParameter() instanceof NumberOfFuzzyTerms) { + numberOfFuzzyTerms.setValue(parameter.getValue()); + } + } + } + + public static List getAvailableParameters() { + return Collections.singletonList(NumberOfFuzzyTerms.getInstance()); + } + + public MethodParamValue getNumberOfFuzzyTerms() { + return numberOfFuzzyTerms; + } + + public List getFuzzyTimeSeries() { + return fuzzyTimeSeries; + } + + public void setFuzzyTimeSeries(List fuzzyTimeSeries) { + this.fuzzyTimeSeries = fuzzyTimeSeries; + } + + public TimeSeries getDefuzzyfiedTimeSeries() { + return defuzzyfiedTimeSeries; + } + + public void setDefuzzifiedTimeSeries(TimeSeries defuzzifiedTimeSeries) { + this.defuzzyfiedTimeSeries = defuzzifiedTimeSeries; + } +} diff --git a/src/main/java/ru/ulstu/method/fuzzy/Triangle.java b/src/main/java/ru/ulstu/method/fuzzy/Triangle.java new file mode 100644 index 0000000..5bf0796 --- /dev/null +++ b/src/main/java/ru/ulstu/method/fuzzy/Triangle.java @@ -0,0 +1,51 @@ +package ru.ulstu.method.fuzzy; + +public class Triangle { + private double start; // левая граница треугольника + private double end; // правая граница треугольника + private double top; // вершина треугольника + + public double getStart() { + return start; + } + + public Triangle(double start, double top, double end) { + this.start = start; + this.top = top; + this.end = end; + } + + public void setStart(int start) { + this.start = start; + } + + + public double getEnd() { + return end; + } + + public void setEnd(int end) { + this.end = end; + } + + public double getTop() { + return top; + } + + public void setTop(int top) { + this.top = top; + } + + public double getValueAtPoint(int pointIndex) { + if (pointIndex == this.getTop()) { + return 1; + } else if ((pointIndex >= this.getEnd()) || (pointIndex <= this.getStart())) { + return 0; + } else if (pointIndex < this.getTop()) { + return (pointIndex - this.getStart()) / (this.getTop() - this.getStart()); + } else if (pointIndex > this.getTop()) { + return -(pointIndex - this.getEnd()) / (this.getEnd() - this.getTop()); + } + return 0; + } +} diff --git a/src/main/java/ru/ulstu/method/fuzzy/parameter/NumberOfFuzzyTerms.java b/src/main/java/ru/ulstu/method/fuzzy/parameter/NumberOfFuzzyTerms.java new file mode 100644 index 0000000..ff22a83 --- /dev/null +++ b/src/main/java/ru/ulstu/method/fuzzy/parameter/NumberOfFuzzyTerms.java @@ -0,0 +1,32 @@ +package ru.ulstu.method.fuzzy.parameter; + +import ru.ulstu.datamodel.ts.TimeSeries; +import ru.ulstu.method.MethodParameter; + +import java.util.ArrayList; +import java.util.List; + +public class NumberOfFuzzyTerms extends MethodParameter { + private final static int MIN_NUMBER_OF_FUZZY_TERMS = 2; + private final static int MIN_INCREASING_STEP_OF_NUMBER_OF_FUZZY_TERMS = 1; + private final static int MAX_NUMBER_OF_FUZZY_TERMS = 7; + + public NumberOfFuzzyTerms() { + super("Number of fuzzy terms"); + } + + public static NumberOfFuzzyTerms getInstance() { + return new NumberOfFuzzyTerms(); + } + + @Override + public List getAvailableValues(TimeSeries timeSeries) { + List values = new ArrayList<>(); + for (double i = MIN_NUMBER_OF_FUZZY_TERMS; + i <= MAX_NUMBER_OF_FUZZY_TERMS; + i += MIN_INCREASING_STEP_OF_NUMBER_OF_FUZZY_TERMS) { + values.add(i); + } + return values; + } +} From 6ee5c0ac6a46ec83a09583bc8492a7d2f930f9ab Mon Sep 17 00:00:00 2001 From: Anton Romanov Date: Wed, 19 Mar 2025 14:02:48 +0400 Subject: [PATCH 2/7] #14 -- Fix triangle generation --- src/main/java/ru/ulstu/method/fuzzy/PlainFuzzy.java | 10 ++++++---- .../method/fuzzy/parameter/NumberOfFuzzyTerms.java | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzy.java b/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzy.java index dfffabe..a7d1908 100644 --- a/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzy.java +++ b/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzy.java @@ -1,5 +1,6 @@ package ru.ulstu.method.fuzzy; +import org.springframework.stereotype.Component; import ru.ulstu.datamodel.Model; import ru.ulstu.datamodel.exception.ModelingException; import ru.ulstu.datamodel.ts.TimeSeries; @@ -12,6 +13,7 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.List; +@Component public class PlainFuzzy extends Method { @Override public List getAvailableParameters() { @@ -37,11 +39,11 @@ public class PlainFuzzy extends Method { .max(Comparator.comparing(TimeSeriesValue::getValue)) .map(TimeSeriesValue::getValue) .orElseThrow(() -> new RuntimeException("Максимальное значение не найдено")); - double delta = (max - min) / numberOfFuzzyTerms; + double delta = ((max - min) / numberOfFuzzyTerms) * 2; for (int i = 0; i < numberOfFuzzyTerms; i++) { - fuzzySets.add(new Triangle(min + i * numberOfFuzzyTerms, - min + i * numberOfFuzzyTerms + delta / 2, - min + i * numberOfFuzzyTerms + delta)); + fuzzySets.add(new Triangle(min + i * delta - delta, + min + i * delta, + min + i * delta + delta)); } return fuzzySets; } diff --git a/src/main/java/ru/ulstu/method/fuzzy/parameter/NumberOfFuzzyTerms.java b/src/main/java/ru/ulstu/method/fuzzy/parameter/NumberOfFuzzyTerms.java index ff22a83..06010b5 100644 --- a/src/main/java/ru/ulstu/method/fuzzy/parameter/NumberOfFuzzyTerms.java +++ b/src/main/java/ru/ulstu/method/fuzzy/parameter/NumberOfFuzzyTerms.java @@ -9,7 +9,7 @@ import java.util.List; public class NumberOfFuzzyTerms extends MethodParameter { private final static int MIN_NUMBER_OF_FUZZY_TERMS = 2; private final static int MIN_INCREASING_STEP_OF_NUMBER_OF_FUZZY_TERMS = 1; - private final static int MAX_NUMBER_OF_FUZZY_TERMS = 7; + private final static int MAX_NUMBER_OF_FUZZY_TERMS = 3; public NumberOfFuzzyTerms() { super("Number of fuzzy terms"); From 58a59e1d031711bc3b1de3326628ea453796f3da Mon Sep 17 00:00:00 2001 From: Anton Romanov Date: Wed, 19 Mar 2025 15:00:30 +0400 Subject: [PATCH 3/7] #14 -- Fix triangle generation --- src/main/java/ru/ulstu/method/fuzzy/PlainFuzzy.java | 4 +++- .../ru/ulstu/method/fuzzy/parameter/NumberOfFuzzyTerms.java | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzy.java b/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzy.java index a7d1908..f5f38dd 100644 --- a/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzy.java +++ b/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzy.java @@ -39,7 +39,9 @@ public class PlainFuzzy extends Method { .max(Comparator.comparing(TimeSeriesValue::getValue)) .map(TimeSeriesValue::getValue) .orElseThrow(() -> new RuntimeException("Максимальное значение не найдено")); - double delta = ((max - min) / numberOfFuzzyTerms) * 2; + + double delta = ((max - min) / (numberOfFuzzyTerms - 1)); + for (int i = 0; i < numberOfFuzzyTerms; i++) { fuzzySets.add(new Triangle(min + i * delta - delta, min + i * delta, diff --git a/src/main/java/ru/ulstu/method/fuzzy/parameter/NumberOfFuzzyTerms.java b/src/main/java/ru/ulstu/method/fuzzy/parameter/NumberOfFuzzyTerms.java index 06010b5..ff22a83 100644 --- a/src/main/java/ru/ulstu/method/fuzzy/parameter/NumberOfFuzzyTerms.java +++ b/src/main/java/ru/ulstu/method/fuzzy/parameter/NumberOfFuzzyTerms.java @@ -9,7 +9,7 @@ import java.util.List; public class NumberOfFuzzyTerms extends MethodParameter { private final static int MIN_NUMBER_OF_FUZZY_TERMS = 2; private final static int MIN_INCREASING_STEP_OF_NUMBER_OF_FUZZY_TERMS = 1; - private final static int MAX_NUMBER_OF_FUZZY_TERMS = 3; + private final static int MAX_NUMBER_OF_FUZZY_TERMS = 7; public NumberOfFuzzyTerms() { super("Number of fuzzy terms"); From 34db9f60183414ba0a35128763d34651ffaea329 Mon Sep 17 00:00:00 2001 From: Anton Romanov Date: Wed, 19 Mar 2025 15:39:18 +0400 Subject: [PATCH 4/7] #14 -- Add forecast stub --- .../ru/ulstu/method/fuzzy/PlainFuzzy.java | 47 +++++++++++++------ .../ulstu/method/fuzzy/PlainFuzzyModel.java | 19 +------- .../java/ru/ulstu/method/fuzzy/Triangle.java | 23 +++++---- 3 files changed, 50 insertions(+), 39 deletions(-) diff --git a/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzy.java b/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzy.java index f5f38dd..b5abddd 100644 --- a/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzy.java +++ b/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzy.java @@ -10,7 +10,7 @@ import ru.ulstu.method.MethodParamValue; import ru.ulstu.method.MethodParameter; import java.util.ArrayList; -import java.util.Comparator; +import java.util.DoubleSummaryStatistics; import java.util.List; @Component @@ -24,35 +24,54 @@ public class PlainFuzzy extends Method { protected Model getModelOfValidTimeSeries(TimeSeries timeSeries, List parameters) { PlainFuzzyModel model = new PlainFuzzyModel(timeSeries, parameters); List fuzzySets = generateFuzzySets(timeSeries, model.getNumberOfFuzzyTerms().getIntValue()); - return null; + for (TimeSeriesValue tsVal : timeSeries.getValues()) { + model.getTimeSeriesModel().addValue(new TimeSeriesValue( + tsVal.getDate(), + getMaxMembership(fuzzySets, tsVal).getTop())); + model.getFuzzyTimeSeries().add(getMaxMembership(fuzzySets, tsVal)); + } + return model; } private List generateFuzzySets(TimeSeries timeSeries, Integer numberOfFuzzyTerms) { - List fuzzySets = new ArrayList(); - double min = timeSeries.getValues() + // Universum + DoubleSummaryStatistics stat = timeSeries.getValues() .stream() - .min(Comparator.comparing(TimeSeriesValue::getValue)) - .map(TimeSeriesValue::getValue) - .orElseThrow(() -> new RuntimeException("Минимальное значение не найдено")); - double max = timeSeries.getValues() - .stream() - .max(Comparator.comparing(TimeSeriesValue::getValue)) - .map(TimeSeriesValue::getValue) - .orElseThrow(() -> new RuntimeException("Максимальное значение не найдено")); + .mapToDouble(TimeSeriesValue::getValue) + .summaryStatistics(); + double min = stat.getMin(); + double max = stat.getMax(); + // Generate fuzzy sets + List fuzzySets = new ArrayList<>(); double delta = ((max - min) / (numberOfFuzzyTerms - 1)); for (int i = 0; i < numberOfFuzzyTerms; i++) { fuzzySets.add(new Triangle(min + i * delta - delta, min + i * delta, - min + i * delta + delta)); + min + i * delta + delta, i)); } return fuzzySets; } + private Triangle getMaxMembership(List fuzzySets, TimeSeriesValue tsVal) { + Triangle maxTriangle = fuzzySets.get(0); + double membersip = 0; + for (Triangle triangle : fuzzySets) { + if (membersip < triangle.getValueAtPoint(tsVal.getValue())) { + maxTriangle = triangle; + membersip = triangle.getValueAtPoint(tsVal.getValue()); + } + } + return maxTriangle; + } + @Override protected TimeSeries getForecastWithValidParams(Model model, TimeSeries forecast) throws ModelingException { - return null; + for (TimeSeriesValue tsVal : forecast.getValues()) { + tsVal.setValue(0.0); + } + return forecast; } @Override diff --git a/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzyModel.java b/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzyModel.java index 686a6ca..a0e0553 100644 --- a/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzyModel.java +++ b/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzyModel.java @@ -11,14 +11,11 @@ import java.util.Collections; import java.util.List; public class PlainFuzzyModel extends Model { - private final static String PREFIX_OF_FUZZY_LABEL = "X"; private final MethodParamValue numberOfFuzzyTerms = new MethodParamValue(NumberOfFuzzyTerms.getInstance(), 2); - private List fuzzyTimeSeries = new ArrayList<>(); - private TimeSeries defuzzyfiedTimeSeries; + private final List fuzzyTimeSeries = new ArrayList<>(); protected PlainFuzzyModel(TimeSeries ts, List parameters) { super(ts); - defuzzyfiedTimeSeries = new TimeSeries("Defuzzified time series of ", ts.getKey()); for (MethodParamValue parameter : parameters) { if (parameter.getParameter() instanceof NumberOfFuzzyTerms) { numberOfFuzzyTerms.setValue(parameter.getValue()); @@ -34,19 +31,7 @@ public class PlainFuzzyModel extends Model { return numberOfFuzzyTerms; } - public List getFuzzyTimeSeries() { + public List getFuzzyTimeSeries() { return fuzzyTimeSeries; } - - public void setFuzzyTimeSeries(List fuzzyTimeSeries) { - this.fuzzyTimeSeries = fuzzyTimeSeries; - } - - public TimeSeries getDefuzzyfiedTimeSeries() { - return defuzzyfiedTimeSeries; - } - - public void setDefuzzifiedTimeSeries(TimeSeries defuzzifiedTimeSeries) { - this.defuzzyfiedTimeSeries = defuzzifiedTimeSeries; - } } diff --git a/src/main/java/ru/ulstu/method/fuzzy/Triangle.java b/src/main/java/ru/ulstu/method/fuzzy/Triangle.java index 5bf0796..5ebf550 100644 --- a/src/main/java/ru/ulstu/method/fuzzy/Triangle.java +++ b/src/main/java/ru/ulstu/method/fuzzy/Triangle.java @@ -1,6 +1,8 @@ package ru.ulstu.method.fuzzy; public class Triangle { + private final static String FUZZY_LABEL_TEMPLATE = "X%s"; + private String label; private double start; // левая граница треугольника private double end; // правая граница треугольника private double top; // вершина треугольника @@ -9,10 +11,11 @@ public class Triangle { return start; } - public Triangle(double start, double top, double end) { + public Triangle(double start, double top, double end, int number) { this.start = start; this.top = top; this.end = end; + this.label = String.format(FUZZY_LABEL_TEMPLATE, number); } public void setStart(int start) { @@ -36,16 +39,20 @@ public class Triangle { this.top = top; } - public double getValueAtPoint(int pointIndex) { - if (pointIndex == this.getTop()) { + public double getValueAtPoint(double crispValue) { + if (crispValue == this.getTop()) { return 1; - } else if ((pointIndex >= this.getEnd()) || (pointIndex <= this.getStart())) { + } else if ((crispValue >= this.getEnd()) || (crispValue <= this.getStart())) { return 0; - } else if (pointIndex < this.getTop()) { - return (pointIndex - this.getStart()) / (this.getTop() - this.getStart()); - } else if (pointIndex > this.getTop()) { - return -(pointIndex - this.getEnd()) / (this.getEnd() - this.getTop()); + } else if (crispValue < this.getTop()) { + return (crispValue - this.getStart()) / (this.getTop() - this.getStart()); + } else if (crispValue > this.getTop()) { + return -(crispValue - this.getEnd()) / (this.getEnd() - this.getTop()); } return 0; } + + public String getLabel() { + return label; + } } From dd73517e935cbc56ae1c4e04371a9d9144e17769 Mon Sep 17 00:00:00 2001 From: Anton Romanov Date: Wed, 19 Mar 2025 17:53:03 +0400 Subject: [PATCH 5/7] #14 -- Add webclient --- build.gradle | 2 + src/main/java/ru/ulstu/http/HttpService.java | 84 +++++++++++++++++++ .../ru/ulstu/method/fuzzy/PlainFuzzy.java | 6 ++ 3 files changed, 92 insertions(+) create mode 100644 src/main/java/ru/ulstu/http/HttpService.java diff --git a/build.gradle b/build.gradle index bd12fee..9115dfe 100644 --- a/build.gradle +++ b/build.gradle @@ -30,6 +30,8 @@ dependencies { implementation group: 'org.springframework.boot', name: 'spring-boot-starter-jetty' implementation group: 'org.springframework.boot', name: 'spring-boot-starter-thymeleaf' implementation group: 'org.springframework.boot', name: 'spring-boot-starter-test' + // web client + implementation group: 'org.springframework.boot', name: 'spring-boot-starter-webflux' implementation group: 'org.slf4j', name: 'slf4j-api' implementation group: 'nz.net.ultraq.thymeleaf', name: 'thymeleaf-layout-dialect' implementation group: 'org.thymeleaf.extras', name: 'thymeleaf-extras-springsecurity6' diff --git a/src/main/java/ru/ulstu/http/HttpService.java b/src/main/java/ru/ulstu/http/HttpService.java new file mode 100644 index 0000000..43a8058 --- /dev/null +++ b/src/main/java/ru/ulstu/http/HttpService.java @@ -0,0 +1,84 @@ +package ru.ulstu.http; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.MediaType; +import org.springframework.web.reactive.function.client.ExchangeStrategies; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.util.Base64; +import java.util.concurrent.CompletableFuture; + +import static java.nio.charset.StandardCharsets.UTF_8; + +public class HttpService { + private final Logger log = LoggerFactory.getLogger(HttpService.class); + private final WebClient client = getWebClient(); + private final static String USER_NAME = "admin"; + private final static String PASSWORD = "admin"; + //private final MultiValueMap myCookies = new LinkedMultiValueMap(); + + public WebClient getWebClient() { + final int size = 16 * 1024 * 1024 * 10; + final ExchangeStrategies strategies = ExchangeStrategies.builder() + .codecs(codecs -> codecs.defaultCodecs().maxInMemorySize(size)) + .build(); + return WebClient.builder() + .exchangeStrategies(strategies) + .build(); + } +// private void auth() { +// try { +// client +// .get() +// .uri(AUTH_URL) +// .headers(headers -> headers.setBasicAuth(USER_NAME, PASSWORD)) +// .header("IBSession", "start") +// .exchange() +// .subscribe(r -> +// { +// System.out.println("get cookies"); +// for (String key : r.cookies().keySet()) { +// myCookies.put(key, List.of(r.cookies().get(key).get(0).getValue())); +// } +// } +// ); +// System.out.println("start waiting"); +// Thread.sleep(1000); +// System.out.println("stop waiting"); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } + +// public String getWithAuth(int yearStart, int yearEnd) { +// auth(); +// return get(yearStart, yearEnd); +// } + + public String post(String url, Object requestBody) { + String response = null; + + try { + System.out.println("set cookies"); + CompletableFuture cf = client + .post() + .uri(String.format(url)) + .header("Authorization", "Basic " + Base64.getEncoder() + .encodeToString((USER_NAME + ":" + PASSWORD).getBytes(UTF_8))) + .header("IBSession", "finish") + .contentType(MediaType.APPLICATION_JSON) + .body(Mono.just(requestBody), String.class) + //.cookies(cookies -> cookies.addAll(myCookies)) + .retrieve() + .bodyToMono(String.class) + .toFuture(); + cf.get(); + response = cf.get(); + } catch (Exception e) { + e.printStackTrace(); + } + return response; + } +} diff --git a/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzy.java b/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzy.java index b5abddd..a73899a 100644 --- a/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzy.java +++ b/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzy.java @@ -5,6 +5,7 @@ import ru.ulstu.datamodel.Model; import ru.ulstu.datamodel.exception.ModelingException; import ru.ulstu.datamodel.ts.TimeSeries; import ru.ulstu.datamodel.ts.TimeSeriesValue; +import ru.ulstu.http.HttpService; import ru.ulstu.method.Method; import ru.ulstu.method.MethodParamValue; import ru.ulstu.method.MethodParameter; @@ -12,9 +13,12 @@ import ru.ulstu.method.MethodParameter; import java.util.ArrayList; import java.util.DoubleSummaryStatistics; import java.util.List; +import java.util.stream.Collectors; @Component public class PlainFuzzy extends Method { + private final HttpService httpService = new HttpService(); + @Override public List getAvailableParameters() { return PlainFuzzyModel.getAvailableParameters(); @@ -68,6 +72,8 @@ public class PlainFuzzy extends Method { @Override protected TimeSeries getForecastWithValidParams(Model model, TimeSeries forecast) throws ModelingException { + String fuzzyTimeSeries = ((PlainFuzzyModel) model).getFuzzyTimeSeries().stream().map(Triangle::getLabel).collect(Collectors.joining(",")); + String result = httpService.post("http://plans.athene.tech/fuzzyRuleRest/generate-rules/3152", fuzzyTimeSeries); for (TimeSeriesValue tsVal : forecast.getValues()) { tsVal.setValue(0.0); } From 11c4071b6841a5eb9b153af57a8e58caacfb86cf Mon Sep 17 00:00:00 2001 From: Anton Romanov Date: Thu, 20 Mar 2025 14:23:43 +0400 Subject: [PATCH 6/7] #14 -- Make forecast request --- src/main/java/ru/ulstu/http/HttpService.java | 44 +++++++++---------- .../ulstu/method/fuzzy/FuzzyRuleDataDto.java | 33 ++++++++++++++ .../ru/ulstu/method/fuzzy/OutputValue.java | 37 ++++++++++++++++ .../ru/ulstu/method/fuzzy/PlainFuzzy.java | 22 +++++++--- .../ulstu/method/fuzzy/PlainFuzzyModel.java | 18 ++++++++ 5 files changed, 127 insertions(+), 27 deletions(-) create mode 100644 src/main/java/ru/ulstu/method/fuzzy/FuzzyRuleDataDto.java create mode 100644 src/main/java/ru/ulstu/method/fuzzy/OutputValue.java diff --git a/src/main/java/ru/ulstu/http/HttpService.java b/src/main/java/ru/ulstu/http/HttpService.java index 43a8058..7ef4484 100644 --- a/src/main/java/ru/ulstu/http/HttpService.java +++ b/src/main/java/ru/ulstu/http/HttpService.java @@ -2,15 +2,17 @@ package ru.ulstu.http; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; -import org.springframework.web.reactive.function.client.ExchangeStrategies; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; +import ru.ulstu.method.fuzzy.FuzzyRuleDataDto; +import ru.ulstu.method.fuzzy.OutputValue; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Base64; -import java.util.concurrent.CompletableFuture; - -import static java.nio.charset.StandardCharsets.UTF_8; +import java.util.List; public class HttpService { private final Logger log = LoggerFactory.getLogger(HttpService.class); @@ -21,11 +23,13 @@ public class HttpService { public WebClient getWebClient() { final int size = 16 * 1024 * 1024 * 10; - final ExchangeStrategies strategies = ExchangeStrategies.builder() + /*final ExchangeStrategies strategies = ExchangeStrategies.builder() .codecs(codecs -> codecs.defaultCodecs().maxInMemorySize(size)) - .build(); + .build();*/ return WebClient.builder() - .exchangeStrategies(strategies) + //.exchangeStrategies(strategies) + .defaultHeader(HttpHeaders.AUTHORIZATION, "Basic " + + Base64.getEncoder().encodeToString((USER_NAME + ":" + PASSWORD).getBytes())) .build(); } // private void auth() { @@ -57,28 +61,24 @@ public class HttpService { // return get(yearStart, yearEnd); // } - public String post(String url, Object requestBody) { - String response = null; + public List post(String url, FuzzyRuleDataDto requestBody) { + List result = new ArrayList<>(); try { - System.out.println("set cookies"); - CompletableFuture cf = client + OutputValue[] res = client .post() - .uri(String.format(url)) - .header("Authorization", "Basic " + Base64.getEncoder() - .encodeToString((USER_NAME + ":" + PASSWORD).getBytes(UTF_8))) - .header("IBSession", "finish") + .uri(url) .contentType(MediaType.APPLICATION_JSON) - .body(Mono.just(requestBody), String.class) - //.cookies(cookies -> cookies.addAll(myCookies)) + .body(Mono.just(requestBody), FuzzyRuleDataDto.class) .retrieve() - .bodyToMono(String.class) - .toFuture(); - cf.get(); - response = cf.get(); + .bodyToMono(OutputValue[].class) + .block(); + if (res != null && res.length > 0) { + result = Arrays.stream(res).toList(); + } } catch (Exception e) { e.printStackTrace(); } - return response; + return result; } } diff --git a/src/main/java/ru/ulstu/method/fuzzy/FuzzyRuleDataDto.java b/src/main/java/ru/ulstu/method/fuzzy/FuzzyRuleDataDto.java new file mode 100644 index 0000000..37eb0ea --- /dev/null +++ b/src/main/java/ru/ulstu/method/fuzzy/FuzzyRuleDataDto.java @@ -0,0 +1,33 @@ +package ru.ulstu.method.fuzzy; + +public class FuzzyRuleDataDto { + private String[] fuzzyTerms; + private int window = 3; + private int horizon = 1; + + public FuzzyRuleDataDto(String[] fuzzyTimeSeries, int window, int horizon) { + this.fuzzyTerms = fuzzyTimeSeries; + this.window = window; + this.horizon = horizon; + } + + public String[] getFuzzyTerms() { + return fuzzyTerms; + } + + public void setFuzzyTerms(String[] fuzzyTerms) { + this.fuzzyTerms = fuzzyTerms; + } + + public int getWindow() { + return window; + } + + public void setWindow(int window) { + this.window = window; + } + + public int getHorizon() { + return horizon; + } +} diff --git a/src/main/java/ru/ulstu/method/fuzzy/OutputValue.java b/src/main/java/ru/ulstu/method/fuzzy/OutputValue.java new file mode 100644 index 0000000..ea40027 --- /dev/null +++ b/src/main/java/ru/ulstu/method/fuzzy/OutputValue.java @@ -0,0 +1,37 @@ +package ru.ulstu.method.fuzzy; + +public class OutputValue { + private String variable; + private String fuzzyTerm; + private Double degree; + + public OutputValue(String variable, String fuzzyTerm, Double degree) { + this.variable = variable; + this.fuzzyTerm = fuzzyTerm; + this.degree = degree; + } + + public String getFuzzyTerm() { + return fuzzyTerm; + } + + public void setFuzzyTerm(String fuzzyTerm) { + this.fuzzyTerm = fuzzyTerm; + } + + public Double getDegree() { + return degree; + } + + public void setDegree(Double degree) { + this.degree = degree; + } + + public String getVariable() { + return variable; + } + + public void setVariable(String variable) { + this.variable = variable; + } +} diff --git a/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzy.java b/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzy.java index a73899a..c0c5b9b 100644 --- a/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzy.java +++ b/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzy.java @@ -13,7 +13,6 @@ import ru.ulstu.method.MethodParameter; import java.util.ArrayList; import java.util.DoubleSummaryStatistics; import java.util.List; -import java.util.stream.Collectors; @Component public class PlainFuzzy extends Method { @@ -28,6 +27,7 @@ public class PlainFuzzy extends Method { protected Model getModelOfValidTimeSeries(TimeSeries timeSeries, List parameters) { PlainFuzzyModel model = new PlainFuzzyModel(timeSeries, parameters); List fuzzySets = generateFuzzySets(timeSeries, model.getNumberOfFuzzyTerms().getIntValue()); + model.setFuzzySets(fuzzySets); for (TimeSeriesValue tsVal : timeSeries.getValues()) { model.getTimeSeriesModel().addValue(new TimeSeriesValue( tsVal.getDate(), @@ -72,10 +72,22 @@ public class PlainFuzzy extends Method { @Override protected TimeSeries getForecastWithValidParams(Model model, TimeSeries forecast) throws ModelingException { - String fuzzyTimeSeries = ((PlainFuzzyModel) model).getFuzzyTimeSeries().stream().map(Triangle::getLabel).collect(Collectors.joining(",")); - String result = httpService.post("http://plans.athene.tech/fuzzyRuleRest/generate-rules/3152", fuzzyTimeSeries); - for (TimeSeriesValue tsVal : forecast.getValues()) { - tsVal.setValue(0.0); + PlainFuzzyModel pfm = ((PlainFuzzyModel) model); + List fuzzyTimeSeries = pfm.getFuzzyTimeSeries().stream().map(Triangle::getLabel).toList(); + List result = httpService.post("http://plans.athene.tech/inferenceRest/get-inference-by-generated-rules", + new FuzzyRuleDataDto(fuzzyTimeSeries.toArray(String[]::new), 2, forecast.getLength())); + List forecastValues = result.stream().map(r -> pfm.getTopValueByLabel(r.getFuzzyTerm())).toList(); + List values = forecast.getValues(); + for (int i = 0; i < values.size(); i++) { + if (forecastValues.isEmpty()) { + values.get(i).setValue(pfm.getTimeSeriesModel().getValues().getLast().getValue()); + } else { + if (forecastValues.size() > i) { + values.get(i).setValue(forecastValues.get(i)); + } else { + values.get(i).setValue(forecastValues.getLast()); + } + } } return forecast; } diff --git a/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzyModel.java b/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzyModel.java index a0e0553..97bf6eb 100644 --- a/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzyModel.java +++ b/src/main/java/ru/ulstu/method/fuzzy/PlainFuzzyModel.java @@ -13,6 +13,7 @@ import java.util.List; public class PlainFuzzyModel extends Model { private final MethodParamValue numberOfFuzzyTerms = new MethodParamValue(NumberOfFuzzyTerms.getInstance(), 2); private final List fuzzyTimeSeries = new ArrayList<>(); + private List fuzzySets = new ArrayList<>(); protected PlainFuzzyModel(TimeSeries ts, List parameters) { super(ts); @@ -34,4 +35,21 @@ public class PlainFuzzyModel extends Model { public List getFuzzyTimeSeries() { return fuzzyTimeSeries; } + + public void setFuzzySets(List fuzzySets) { + this.fuzzySets = fuzzySets; + } + + public List getFuzzySets() { + return fuzzySets; + } + + public double getTopValueByLabel(String label) { + return fuzzySets + .stream() + .filter(fs -> fs.getLabel().equals(label)) + .findAny() + .orElseThrow(() -> new RuntimeException("Неизвестная нечеткая метка")) + .getTop(); + } } From 9a12181ccf47f7aa94deb06c6eee02e74165a200 Mon Sep 17 00:00:00 2001 From: Anton Romanov Date: Thu, 20 Mar 2025 14:24:48 +0400 Subject: [PATCH 7/7] #14 -- Fix code --- src/main/java/ru/ulstu/http/HttpService.java | 37 -------------------- 1 file changed, 37 deletions(-) diff --git a/src/main/java/ru/ulstu/http/HttpService.java b/src/main/java/ru/ulstu/http/HttpService.java index 7ef4484..282f5bd 100644 --- a/src/main/java/ru/ulstu/http/HttpService.java +++ b/src/main/java/ru/ulstu/http/HttpService.java @@ -1,7 +1,5 @@ package ru.ulstu.http; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.web.reactive.function.client.WebClient; @@ -15,51 +13,16 @@ import java.util.Base64; import java.util.List; public class HttpService { - private final Logger log = LoggerFactory.getLogger(HttpService.class); private final WebClient client = getWebClient(); private final static String USER_NAME = "admin"; private final static String PASSWORD = "admin"; - //private final MultiValueMap myCookies = new LinkedMultiValueMap(); public WebClient getWebClient() { - final int size = 16 * 1024 * 1024 * 10; - /*final ExchangeStrategies strategies = ExchangeStrategies.builder() - .codecs(codecs -> codecs.defaultCodecs().maxInMemorySize(size)) - .build();*/ return WebClient.builder() - //.exchangeStrategies(strategies) .defaultHeader(HttpHeaders.AUTHORIZATION, "Basic " + Base64.getEncoder().encodeToString((USER_NAME + ":" + PASSWORD).getBytes())) .build(); } -// private void auth() { -// try { -// client -// .get() -// .uri(AUTH_URL) -// .headers(headers -> headers.setBasicAuth(USER_NAME, PASSWORD)) -// .header("IBSession", "start") -// .exchange() -// .subscribe(r -> -// { -// System.out.println("get cookies"); -// for (String key : r.cookies().keySet()) { -// myCookies.put(key, List.of(r.cookies().get(key).get(0).getValue())); -// } -// } -// ); -// System.out.println("start waiting"); -// Thread.sleep(1000); -// System.out.println("stop waiting"); -// } catch (Exception e) { -// e.printStackTrace(); -// } -// } - -// public String getWithAuth(int yearStart, int yearEnd) { -// auth(); -// return get(yearStart, yearEnd); -// } public List post(String url, FuzzyRuleDataDto requestBody) { List result = new ArrayList<>();