1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package fr.inrae.agroclim.indicators.model.indicator;
18
19 import java.util.ArrayList;
20 import java.util.HashMap;
21 import java.util.HashSet;
22 import java.util.List;
23 import java.util.Map;
24 import java.util.Set;
25
26 import fr.inrae.agroclim.indicators.exception.IndicatorsException;
27 import fr.inrae.agroclim.indicators.model.Knowledge;
28 import fr.inrae.agroclim.indicators.model.Parameter;
29 import fr.inrae.agroclim.indicators.model.data.DailyData;
30 import fr.inrae.agroclim.indicators.model.data.Resource;
31 import fr.inrae.agroclim.indicators.model.data.Variable;
32 import fr.inrae.agroclim.indicators.model.indicator.listener.IndicatorEvent;
33 import fr.inrae.agroclim.indicators.model.indicator.listener.IndicatorListener;
34 import fr.inrae.agroclim.indicators.util.Doublet;
35 import jakarta.xml.bind.annotation.XmlRootElement;
36 import jakarta.xml.bind.annotation.XmlType;
37 import lombok.EqualsAndHashCode;
38 import lombok.Getter;
39 import lombok.Setter;
40
41
42
43
44
45
46 @XmlRootElement
47 @XmlType(propOrder = {"sumVariable1", "sumVariable2"})
48 @EqualsAndHashCode(
49 callSuper = false,
50 of = {"sumVariable1", "sumVariable2"}
51 )
52 public final class DiffOfSum extends SimpleIndicator implements Detailable, IndicatorListener {
53
54
55
56
57 private static final long serialVersionUID = 6030595237342422005L;
58
59
60
61
62 @Getter
63 @Setter
64 private Sum sumVariable1;
65
66
67
68
69 @Getter
70 @Setter
71 private Sum sumVariable2;
72
73
74
75
76 public DiffOfSum() {
77 super();
78 }
79
80 @Override
81 public DiffOfSum clone() throws CloneNotSupportedException {
82 final DiffOfSum clone = (DiffOfSum) super.clone();
83 if (sumVariable1 != null) {
84 clone.sumVariable1 = sumVariable1.clone();
85 }
86 if (sumVariable2 != null) {
87 clone.sumVariable2 = sumVariable2.clone();
88 }
89 return clone;
90 }
91
92 @Override
93 public double computeSingleValue(final Resource<? extends DailyData> res) throws IndicatorsException {
94 final double sum1 = getSumVariable1().compute(res);
95 final double sum2 = getSumVariable2().compute(res);
96 return sum1 - sum2;
97 }
98
99 @Override
100 public List<Doublet<Parameter, Number>> getParameterDefaults() {
101 final List<Doublet<Parameter, Number>> val = new ArrayList<>();
102 if (sumVariable1 != null) {
103 val.addAll(sumVariable1.getParameterDefaults());
104 }
105 if (sumVariable2 != null) {
106 val.addAll(sumVariable2.getParameterDefaults());
107 }
108 return val;
109 }
110
111 @Override
112 public List<Parameter> getParameters() {
113 final List<Parameter> params = new ArrayList<>();
114 if (sumVariable1 != null) {
115 params.addAll(sumVariable1.getParameters());
116 }
117 if (sumVariable2 != null) {
118 params.addAll(sumVariable2.getParameters());
119 }
120 return params;
121 }
122
123 @Override
124 public Map<String, Double> getParametersValues() {
125 final Map<String, Double> val = new HashMap<>();
126 if (sumVariable1 != null) {
127 val.putAll(sumVariable1.getParametersValues());
128 }
129 if (sumVariable2 != null) {
130 val.putAll(sumVariable2.getParametersValues());
131 }
132 return val;
133 }
134
135 @Override
136 public Set<Variable> getVariables() {
137 final Set<Variable> variables = new HashSet<>();
138 if (sumVariable1 != null) {
139 variables.addAll(sumVariable1.getVariables());
140 }
141 if (sumVariable2 != null) {
142 variables.addAll(sumVariable2.getVariables());
143 }
144 return variables;
145 }
146
147 @Override
148 public boolean isComputable(final Resource<? extends DailyData> res) {
149 return sumVariable1.isComputable(res) && sumVariable2.isComputable(res);
150 }
151
152 @Override
153 public void onIndicatorEvent(final IndicatorEvent event) {
154 if (event.getAssociatedType() != IndicatorEvent.Type.CHANGE) {
155 return;
156 }
157 final IndicatorEvent e = IndicatorEvent.Type.CHANGE.event(this);
158 fireIndicatorEvent(e);
159 }
160
161 @Override
162 public void removeParameter(final Parameter param) {
163 if (sumVariable1 != null) {
164 sumVariable1.removeParameter(param);
165 }
166 if (sumVariable2 != null) {
167 sumVariable2.removeParameter(param);
168 }
169 }
170
171 @Override
172 public void setParametersFromKnowledge(final Knowledge knowledge) {
173 if (sumVariable1 == null || sumVariable2 == null) {
174 return;
175 }
176 final DiffOfSum indicator = (DiffOfSum) knowledge.getIndicator(getId());
177 if (indicator == null) {
178 return;
179 }
180 if (indicator.getSumVariable1() != null) {
181 sumVariable1.setParameters(
182 indicator.getSumVariable1().getParameters());
183 }
184 if (indicator.getSumVariable2() != null) {
185 sumVariable2.setParameters(
186 indicator.getSumVariable1().getParameters());
187 }
188 }
189
190 @Override
191 public void setParametersValues(final Map<String, Double> values) {
192 if (sumVariable1 != null) {
193 sumVariable1.setParametersValues(values);
194 }
195 if (sumVariable2 != null) {
196 sumVariable2.setParametersValues(values);
197 }
198 }
199
200 @Override
201 public String toStringTree(final String indent) {
202 final StringBuilder sb = new StringBuilder();
203 sb.append(toStringTreeBase(indent));
204
205 if (sumVariable1 != null) {
206 sb.append(indent).append(" sumVariable1:\n");
207 sb.append(sumVariable1.toStringTree(indent + " "))
208 .append("\n");
209 }
210 if (sumVariable2 != null) {
211 sb.append(indent).append(" sumVariable2:\n");
212 sb.append(sumVariable2.toStringTree(indent + " "))
213 .append("\n");
214 }
215 return sb.toString();
216 }
217
218 }