1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package fr.inrae.agroclim.indicators.model.function.normalization;
20
21 import java.util.ArrayList;
22 import java.util.Arrays;
23 import java.util.List;
24 import java.util.StringJoiner;
25 import java.util.stream.Stream;
26
27 import jakarta.xml.bind.annotation.XmlElement;
28 import jakarta.xml.bind.annotation.XmlRootElement;
29 import lombok.Getter;
30 import lombok.Setter;
31 import lombok.ToString;
32
33
34
35
36
37
38
39
40
41 @XmlRootElement
42 @ToString
43 public final class MultiLinear extends NormalizationFunction {
44
45
46
47
48 private static final long serialVersionUID = 4872847709393688047L;
49
50
51
52
53 @Getter
54 @Setter
55 @XmlElement(name = "interval")
56 private List<MultiLinearInterval> intervals = new ArrayList<>();
57
58
59
60
61 public MultiLinear() {
62
63 }
64
65 @Override
66 public MultiLinear clone() {
67 final MultiLinear clone = new MultiLinear();
68 if (intervals != null && !intervals.isEmpty()) {
69 clone.setIntervals(new ArrayList<>());
70 intervals.forEach(interval -> clone.getIntervals().add(interval.clone()));
71 }
72 return clone;
73 }
74
75 @Override
76 public String getFormulaMathML() {
77 final StringJoiner sj = new StringJoiner("\n");
78 sj.add("<mfenced open=\"{\" close=\"\">");
79 sj.add(" <mtable>");
80 final Stream<MultiLinearInterval> stream;
81 if (intervals != null) {
82 stream = intervals.stream();
83 } else {
84 final MultiLinearInterval interval = new MultiLinearInterval();
85 interval.setLinear(new Linear());
86 stream = Arrays.asList(interval).stream();
87 }
88 stream.filter(interval -> interval.getLinear() != null)
89 .forEach(interval -> {
90 sj.add(" <mtr>");
91 sj.add(" <mtd>");
92 sj.add(interval.getLinear().getFormulaMathML());
93 sj.add(" </mtd>");
94 sj.add(" <mtd>");
95 sj.add(" <mn>x</mn><mo>∈</mo><mn>[");
96 final Double iMin = interval.getMin();
97 final Double iMax = interval.getMax();
98 if (iMin != null) {
99 sj.add(iMin.toString());
100 } else {
101 sj.add("-∞");
102 }
103 sj.add("; ");
104 if (iMax != null) {
105 sj.add(iMax.toString() + "[;");
106 } else {
107 sj.add("+∞];");
108 }
109 sj.add("</mn>");
110 sj.add(" </mtd>");
111 sj.add(" </mtr>");
112 });
113 sj.add(" </mtable>");
114 sj.add("</mfenced>");
115 return sj.toString();
116 }
117
118 @Override
119 public double normalize(final double value) {
120 if (intervals == null || intervals.isEmpty()) {
121 return 0;
122 }
123 for (final MultiLinearInterval interval : intervals) {
124 if (interval.matches(value)) {
125 return interval.getLinear().normalize(value);
126 }
127 }
128 return 0;
129 }
130
131 }