Skip to content
Snippets Groups Projects
Commit dd850cdb authored by Tor-Einar Skog's avatar Tor-Einar Skog
Browse files

Allowing for just one of height / MSC to be set of the optimization parameters

Avoiding some ConcurrentModificationExceptions by copying list 
parent 7571ac60
No related branches found
No related tags found
No related merge requests found
......@@ -65,6 +65,10 @@ public class OptimizationObservation implements Comparable{
*/
public Double getAvling()
{
if(this.getHeight() == null)
{
return null;
}
return 34.86f + 0.017f * (Double) Math.pow(this.getHeight(), 2) + 10.21f * this.getHeight();
}
......
......@@ -236,8 +236,7 @@ public class RoughageNutritionModel implements Model {
@Override
public void setConfiguration(ModelConfiguration config) throws ConfigValidationException {
/*
// Daily values
List<WeatherObservation> luftTemperatur, TM
......@@ -456,27 +455,36 @@ public class RoughageNutritionModel implements Model {
}
}
private List<OptimizationObservation> parseOptimizationInfo(List<String> optimizationInfo, TimeZone timeZone) {
private List<OptimizationObservation> parseOptimizationInfo(List<String> optimizationInfo, TimeZone timeZone) throws ConfigValidationException {
List<OptimizationObservation> retVal = new ArrayList<>();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
format.setTimeZone(timeZone);
for(String line:optimizationInfo)
{
String[] parts = line.split(",");
// The -1 as second parameter ensures that trailing delimiters will not be discarded,
// Thus avoiding ArrayIndexOutOfBoundsException when parsing
// E.g. "2015-06-02,2,3,,,,"
String[] parts = line.split(",",-1);
try
{
OptimizationObservation optObs = new OptimizationObservation(
format.parse(parts[0]), // Date
Double.parseDouble(parts[1]), // Height
Double.parseDouble(parts[2]), // MSC
Double.parseDouble(parts[4]), // NDF
Double.parseDouble(parts[5]), // INDF
Double.parseDouble(parts[6]), // Raw protein
Double.parseDouble(parts[3]) // FEm
(! parts[1].trim().isEmpty() ? Double.parseDouble(parts[1]) : null), // Height
(! parts[2].trim().isEmpty() ? Double.parseDouble(parts[2]) : null), // MSC
(! parts[4].trim().isEmpty() ? Double.parseDouble(parts[4]) : null), // NDF
(! parts[5].trim().isEmpty() ? Double.parseDouble(parts[5]) : null), // INDF
(! parts[6].trim().isEmpty() ? Double.parseDouble(parts[6]) : null), // Raw protein
(! parts[3].trim().isEmpty() ? Double.parseDouble(parts[3]) : null) // FEm
);
if(optObs.getHeight() == null && optObs.getMSC() == null)
{
throw new ConfigValidationException("Optimization error: Height and/or MSC must be set");
}
retVal.add(optObs);
}
catch(ArrayIndexOutOfBoundsException | ParseException ex) {
throw new ConfigValidationException("There's something wrong with this line of optimization observations: " +
line + " . The error is: " + ex.getClass() + ":" + ex.getMessage());
}
}
return retVal;
......
......@@ -28,6 +28,7 @@ import com.ibm.icu.util.Calendar;
import com.ibm.icu.util.TimeZone;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
......@@ -87,6 +88,9 @@ public class RoughageNutritionModelTest {
config.setConfigParameter("firstHarvest", cal.getTime());
config.setConfigParameter("soilType", RoughageNutritionModel.JORDTYPE_SAND);
config.setConfigParameter("cloverShare", RoughageNutritionModel.ENGSAMMENSETNING_KLOEVERANDEL_LITEN);
String[] optimizationInfoLines = {"2015-06-02,2,3,,,,"};
List<String> optimizationInfo = Arrays.asList(optimizationInfoLines);
config.setConfigParameter("optimizationInfo", optimizationInfo);
RoughageNutritionModel instance = new RoughageNutritionModel();
instance.setConfiguration(config);
//List<Result> expResult = null;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment