Mercurial > gemma
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 }