/
routes.go
125 lines (94 loc) · 2.08 KB
/
routes.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package routes
import (
"github.com/gin-gonic/gin"
"github.com/gonum/stat"
"gonum.org/v1/gonum/stat/distuv"
"github.com/ndabAP/vue-go-example/internal/db"
)
type memData struct {
Data []float64 `binding:"required"`
}
type dbSchema struct {
ID uint
Data []float64 `binding:"required"`
}
type tuple struct {
X float64 `json:"x"`
Y float64 `json:"y"`
}
func init() {
db.SetupDb()
}
// Persist saves the given data
func Persist(c *gin.Context) {
data := new(memData)
c.Bind(&data)
memDB := db.Database
txn := memDB.Txn(true)
p := &dbSchema{uint(1), data.Data}
if err := txn.Insert("data", p); err != nil {
panic(err)
}
txn.Commit()
}
// Mean returns the average from the in-memory data
func Mean(c *gin.Context) {
memDB := db.Database
txn := memDB.Txn(false)
defer txn.Abort()
raw, err := txn.First("data", "id", uint(1))
if err != nil {
panic(err)
}
mean := stat.Mean(raw.(*dbSchema).Data, nil)
c.JSON(200, mean)
}
// StdDev returns the standard deviation from the in-memory data
func StdDev(c *gin.Context) {
memDB := db.Database
txn := memDB.Txn(false)
defer txn.Abort()
raw, err := txn.First("data", "id", uint(1))
if err != nil {
panic(err)
}
stdev := stat.StdDev(raw.(*dbSchema).Data, nil)
c.JSON(200, stdev)
}
// NormalCDF returns the cumulative normal distribution from the in-memory data
func NormalCDF(c *gin.Context) {
memDB := db.Database
txn := memDB.Txn(false)
defer txn.Abort()
raw, err := txn.First("data", "id", uint(1))
if err != nil {
panic(err)
}
data := raw.(*dbSchema).Data
data = uniq(data)
dist := distuv.Normal{
Mu: stat.Mean(data, nil),
Sigma: stat.StdDev(data, nil),
}
var normalcdf []tuple
for _, x := range data {
normal := tuple{
x,
dist.CDF(x) * 10000, // see https://github.com/forio/contour/issues/256
}
normalcdf = append(normalcdf, normal)
}
c.JSON(200, normalcdf)
}
// Returns unique values of a slice
func uniq(s []float64) []float64 {
m := map[float64]bool{}
var r []float64
for _, v := range s {
if _, seen := m[v]; !seen {
r = append(r, v)
m[v] = true
}
}
return r
}