View Javadoc
1   /**
2    * This file is part of Indicators.
3    *
4    * Indicators is free software: you can redistribute it and/or modify
5    * it under the terms of the GNU General Public License as published by
6    * the Free Software Foundation, either version 3 of the License, or
7    * (at your option) any later version.
8    *
9    * Indicators is distributed in the hope that it will be useful,
10   * but WITHOUT ANY WARRANTY; without even the implied warranty of
11   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12   * GNU General Public License for more details.
13   *
14   * You should have received a copy of the GNU General Public License
15   * along with Indicators. If not, see <https://www.gnu.org/licenses/>.
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   * Substraction of 2 values from Sum.
43   *
44   * @author jcufi
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       * UUID for Serializable.
56       */
57      private static final long serialVersionUID = 6030595237342422005L;
58  
59      /**
60       * Indicator which sums variable for minuend.
61       */
62      @Getter
63      @Setter
64      private Sum sumVariable1;
65  
66      /**
67       * Indicator which sums variable for subtrahend.
68       */
69      @Getter
70      @Setter
71      private Sum sumVariable2;
72  
73      /**
74       * Constructor.
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 }