changeset 3097:e6ba32b060df

Nash Sutcliffe: Treat last prediction date as valid afterwards. Small optimizsations.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 23 Apr 2019 18:10:19 +0200
parents cb3360653652
children 8f2ac24b0cb3
files pkg/common/nashsutcliffe.go pkg/controllers/gauges.go
diffstat 2 files changed, 39 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/common/nashsutcliffe.go	Tue Apr 23 16:53:56 2019 +0200
+++ b/pkg/common/nashsutcliffe.go	Tue Apr 23 18:10:19 2019 +0200
@@ -49,9 +49,11 @@
 			continue
 		}
 		if m1.When.Equal(when) {
+			//log.Printf("matches first: %f\n", m1.Value)
 			return m1.Value, true
 		}
 		if m2.When.Equal(when) {
+			//log.Printf("matches second: %f\n", m1.Value)
 			return m2.Value, true
 		}
 
@@ -69,13 +71,27 @@
 		a := (m1.Value - m2.Value) / m1.When.Sub(m2.When).Seconds()
 		b := m1.Value - m1.When.Sub(utc0).Seconds()*a
 		m := when.Sub(utc0).Seconds()*a + b
+
+		//log.Printf("%f %f %f\n", m1.Value, m, m2.Value)
 		return m, true
 	}
 
-	if len(mvs) == 1 && when.Equal(mvs[0].When) {
-		return mvs[0].Value, true
+	if l := len(mvs); l > 0 {
+		if when.Equal(mvs[0].When) {
+			//log.Printf("at start\n")
+			return mvs[0].Value, true
+		}
+		if !when.Before(mvs[l-1].When) {
+			//log.Printf("after end\n")
+		}
+		return mvs[l-1].Value, true
 	}
 
+	//if len(mvs) > 0 {
+	//	log.Printf("does not match %v %v %v\n",
+	//		mvs[0].When, mvs[len(mvs)-1].When.Sub(mvs[0].When), when)
+	//}
+
 	return 0, false
 }
 
--- a/pkg/controllers/gauges.go	Tue Apr 23 16:53:56 2019 +0200
+++ b/pkg/controllers/gauges.go	Tue Apr 23 18:10:19 2019 +0200
@@ -474,7 +474,7 @@
 
 		if hasCurrent {
 			if !current.when.Equal(measureDate) {
-				if !math.IsNaN(current.observed) {
+				if !math.IsNaN(current.observed) && len(current.predicted) > 0 {
 					values = append(values, current)
 				}
 				current = observedPredictedValues{
@@ -491,10 +491,16 @@
 		}
 
 		if predicted {
-			current.predicted = append(
-				current.predicted,
-				common.TimedValue{When: issueDate, Value: value},
-			)
+			// current prediction same as last two?
+			if l := len(current.predicted); l > 1 && current.predicted[l-1].Value == value && current.predicted[l-2].Value == value {
+				// only update last time.
+				current.predicted[l-1].When = issueDate
+			} else {
+				current.predicted = append(
+					current.predicted,
+					common.TimedValue{When: issueDate, Value: value},
+				)
+			}
 		} else {
 			current.observed = value
 		}
@@ -504,10 +510,19 @@
 		return nil, err
 	}
 
-	if hasCurrent && !math.IsNaN(current.observed) {
+	if hasCurrent && !math.IsNaN(current.observed) && len(current.predicted) > 0 {
 		values = append(values, current)
 	}
 
+	// for i := range values {
+	// 	log.Printf("%v %f %d\n", values[i].when, values[i].observed, len(values[i].predicted))
+	// 	if len(values[i].predicted) > 0 {
+	// 		for j := range values[i].predicted {
+	// 			log.Printf("\t%v %f\n", values[i].predicted[j].When, values[i].predicted[j].Value)
+	// 		}
+	// 	}
+	// }
+
 	return values, nil
 }