Mercurial > gemma
annotate pkg/common/round.go @ 4615:32d3e0cecf4f geoserver_sql_views
Merge default into geoserver_sql_views
author | Tom Gottfried <tom@intevation.de> |
---|---|
date | Mon, 09 Sep 2019 17:46:51 +0200 |
parents | 97312d7954ba |
children | e739a4806d7c |
rev | line source |
---|---|
4353
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
1 // This is Free Software under GNU Affero General Public License v >= 3.0 |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
2 // without warranty, see README.md and license for details. |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
3 // |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
4 // SPDX-License-Identifier: AGPL-3.0-or-later |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
5 // License-Filename: LICENSES/AGPL-3.0.txt |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
6 // |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
7 // Copyright (C) 2018 by via donau |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
8 // – Österreichische Wasserstraßen-Gesellschaft mbH |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
9 // Software engineering by Intevation GmbH |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
10 // |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
11 // Author(s): |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
12 // * Sascha Wilde <wilde@sha-bang.de> |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
13 |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
14 package common |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
15 |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
16 import ( |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
17 "math" |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
18 "sort" |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
19 "time" |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
20 ) |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
21 |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
22 type Rest struct { |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
23 Key int |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
24 Rest float64 |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
25 } |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
26 |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
27 // Simple sum preserving rounding method: |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
28 func SumPreservingRound(arr []float64) []int { |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
29 var ( |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
30 sum float64 |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
31 rests []Rest |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
32 ) |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
33 result := make([]int, len(arr)) |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
34 |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
35 // floor all values |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
36 for i, v := range arr { |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
37 sum += v |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
38 result[i] = int(v) |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
39 rests = append(rests, Rest{Key: i, Rest: v - float64(result[i])}) |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
40 } |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
41 |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
42 // find the difference in summs |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
43 var newSum int |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
44 for _, v := range result { |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
45 newSum += v |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
46 } |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
47 delta := int(math.Round(sum)) - newSum |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
48 |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
49 // spread delta over values with highest rest |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
50 sort.Slice(rests, func(i, j int) bool { |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
51 return rests[i].Rest > rests[j].Rest |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
52 }) |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
53 for _, v := range rests { |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
54 if delta <= 0 { |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
55 break |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
56 } |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
57 result[v.Key]++ |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
58 delta-- |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
59 } |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
60 |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
61 return result |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
62 } |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
63 |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
64 // Round anarray of Duratons to full days |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
65 func RoundToFullDays(durations []time.Duration) []int { |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
66 days := make([]float64, len(durations)) |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
67 for i, v := range durations { |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
68 days[i] = v.Hours() / 24 |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
69 } |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
70 return SumPreservingRound(days) |
97312d7954ba
FA diagrams: round to full days in back end.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
71 } |