515 lines
11 KiB
Go
515 lines
11 KiB
Go
|
//go:build js && wasm
|
||
|
// +build js,wasm
|
||
|
|
||
|
package src
|
||
|
|
||
|
import (
|
||
|
"syscall/js"
|
||
|
|
||
|
"gonum.org/v1/gonum/stat"
|
||
|
)
|
||
|
|
||
|
func Bhattacharyya(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
p = JSFloatArray(args[0])
|
||
|
q = JSFloatArray(args[1])
|
||
|
)
|
||
|
return stat.Bhattacharyya(p, q)
|
||
|
}
|
||
|
|
||
|
func BivariateMoment(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
r = args[0].Float()
|
||
|
s = args[1].Float()
|
||
|
xs = JSFloatArray(args[2])
|
||
|
ys = JSFloatArray(args[3])
|
||
|
weights = JSFloatArray(args[4])
|
||
|
)
|
||
|
if len(weights) == 0 {
|
||
|
weights = nil
|
||
|
}
|
||
|
return stat.BivariateMoment(r, s, xs, ys, weights)
|
||
|
}
|
||
|
|
||
|
func CDF(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
q = args[0].Float()
|
||
|
xs = JSFloatArray(args[2])
|
||
|
weights = JSFloatArray(args[3])
|
||
|
)
|
||
|
return stat.CDF(q, 1, xs, weights)
|
||
|
}
|
||
|
|
||
|
func ChiSquare(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
p = JSFloatArray(args[0])
|
||
|
q = JSFloatArray(args[1])
|
||
|
)
|
||
|
return stat.ChiSquare(p, q)
|
||
|
}
|
||
|
|
||
|
func CircularMean(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
xs = JSFloatArray(args[0])
|
||
|
weights = JSFloatArray(args[1])
|
||
|
)
|
||
|
if len(weights) == 0 {
|
||
|
weights = nil
|
||
|
}
|
||
|
return stat.CircularMean(xs, weights)
|
||
|
}
|
||
|
|
||
|
func Correlation(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
xs = JSFloatArray(args[0])
|
||
|
ys = JSFloatArray(args[1])
|
||
|
weights = JSFloatArray(args[2])
|
||
|
)
|
||
|
if len(weights) == 0 {
|
||
|
weights = nil
|
||
|
}
|
||
|
return stat.Correlation(xs, ys, weights)
|
||
|
}
|
||
|
|
||
|
func CorrelationMatrix(this js.Value, args []js.Value) interface{} {
|
||
|
panic("not implemented")
|
||
|
}
|
||
|
|
||
|
func Covariance(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
xs = JSFloatArray(args[0])
|
||
|
ys = JSFloatArray(args[1])
|
||
|
weights = JSFloatArray(args[2])
|
||
|
)
|
||
|
if len(weights) == 0 {
|
||
|
weights = nil
|
||
|
}
|
||
|
return stat.Covariance(xs, ys, weights)
|
||
|
}
|
||
|
|
||
|
func CovarianceMatrix(this js.Value, args []js.Value) interface{} {
|
||
|
panic("not implemented")
|
||
|
}
|
||
|
|
||
|
func CrossEntropy(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
p = JSFloatArray(args[0])
|
||
|
q = JSFloatArray(args[1])
|
||
|
)
|
||
|
return stat.CrossEntropy(p, q)
|
||
|
}
|
||
|
|
||
|
func Entropy(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
p = JSFloatArray(args[0])
|
||
|
)
|
||
|
return stat.Entropy(p)
|
||
|
}
|
||
|
|
||
|
func ExKurtosis(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
xs = JSFloatArray(args[0])
|
||
|
weights = JSFloatArray(args[1])
|
||
|
)
|
||
|
if len(weights) == 0 {
|
||
|
weights = nil
|
||
|
}
|
||
|
return stat.ExKurtosis(xs, weights)
|
||
|
}
|
||
|
|
||
|
func GeometricMean(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
xs = JSFloatArray(args[0])
|
||
|
weights = JSFloatArray(args[1])
|
||
|
)
|
||
|
if len(weights) == 0 {
|
||
|
weights = nil
|
||
|
}
|
||
|
return stat.GeometricMean(xs, weights)
|
||
|
}
|
||
|
|
||
|
func HarmonicMean(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
xs = JSFloatArray(args[0])
|
||
|
weights = JSFloatArray(args[1])
|
||
|
)
|
||
|
if len(weights) == 0 {
|
||
|
weights = nil
|
||
|
}
|
||
|
return stat.HarmonicMean(xs, weights)
|
||
|
}
|
||
|
|
||
|
func Hellinger(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
p = JSFloatArray(args[0])
|
||
|
q = JSFloatArray(args[1])
|
||
|
)
|
||
|
return stat.Hellinger(p, q)
|
||
|
}
|
||
|
|
||
|
func Histogram(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
counts = JSFloatArray(args[0])
|
||
|
divs = JSFloatArray(args[1])
|
||
|
xs = JSFloatArray(args[2])
|
||
|
weights = JSFloatArray(args[3])
|
||
|
)
|
||
|
if len(weights) == 0 {
|
||
|
weights = nil
|
||
|
}
|
||
|
return stat.Histogram(counts, divs, xs, weights)
|
||
|
}
|
||
|
|
||
|
func JensenShannon(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
p = JSFloatArray(args[0])
|
||
|
q = JSFloatArray(args[1])
|
||
|
)
|
||
|
return stat.JensenShannon(p, q)
|
||
|
}
|
||
|
|
||
|
func Kendall(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
xs = JSFloatArray(args[0])
|
||
|
ys = JSFloatArray(args[1])
|
||
|
weights = JSFloatArray(args[2])
|
||
|
)
|
||
|
if len(weights) == 0 {
|
||
|
weights = nil
|
||
|
}
|
||
|
return stat.Kendall(xs, ys, weights)
|
||
|
}
|
||
|
|
||
|
func KolmogorovSmirnov(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
xs = JSFloatArray(args[0])
|
||
|
xWeights = JSFloatArray(args[1])
|
||
|
ys = JSFloatArray(args[2])
|
||
|
yWeights = JSFloatArray(args[3])
|
||
|
)
|
||
|
return stat.KolmogorovSmirnov(xs, xWeights, ys, yWeights)
|
||
|
}
|
||
|
|
||
|
func KullbackLeibler(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
p = JSFloatArray(args[0])
|
||
|
q = JSFloatArray(args[1])
|
||
|
)
|
||
|
return stat.KullbackLeibler(p, q)
|
||
|
}
|
||
|
|
||
|
func LinearRegression(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
xs = JSFloatArray(args[0])
|
||
|
ys = JSFloatArray(args[1])
|
||
|
weights = JSFloatArray(args[2])
|
||
|
origin = args[3].Bool()
|
||
|
)
|
||
|
if len(weights) == 0 {
|
||
|
weights = nil
|
||
|
}
|
||
|
alpha, beta := stat.LinearRegression(xs, ys, weights, origin)
|
||
|
return map[string]interface{}{
|
||
|
"alpha": alpha,
|
||
|
"beta": beta,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func Mahalanobis(this js.Value, args []js.Value) interface{} {
|
||
|
panic("not implemented")
|
||
|
}
|
||
|
|
||
|
func Mean(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
xs = JSFloatArray(args[0])
|
||
|
weights = JSFloatArray(args[1])
|
||
|
)
|
||
|
if len(weights) == 0 {
|
||
|
weights = nil
|
||
|
}
|
||
|
return stat.Mean(xs, weights)
|
||
|
}
|
||
|
|
||
|
func MeanStdDev(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
xs = JSFloatArray(args[0])
|
||
|
weights = JSFloatArray(args[1])
|
||
|
)
|
||
|
if len(weights) == 0 {
|
||
|
weights = nil
|
||
|
}
|
||
|
mean, stdDev := stat.MeanStdDev(xs, weights)
|
||
|
return map[string]interface{}{
|
||
|
"mean": mean,
|
||
|
"stdDev": stdDev,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func MeanVariance(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
xs = JSFloatArray(args[0])
|
||
|
weights = JSFloatArray(args[1])
|
||
|
)
|
||
|
if len(weights) == 0 {
|
||
|
weights = nil
|
||
|
}
|
||
|
mean, variance := stat.MeanVariance(xs, weights)
|
||
|
return map[string]interface{}{
|
||
|
"mean": mean,
|
||
|
"variance": variance,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func Mode(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
xs = JSFloatArray(args[0])
|
||
|
weights = JSFloatArray(args[1])
|
||
|
)
|
||
|
if len(weights) == 0 {
|
||
|
weights = nil
|
||
|
}
|
||
|
value, count := stat.Mode(xs, weights)
|
||
|
return map[string]interface{}{
|
||
|
"value": value,
|
||
|
"count": count,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func Moment(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
r = args[0].Float()
|
||
|
xs = JSFloatArray(args[1])
|
||
|
weights = JSFloatArray(args[2])
|
||
|
)
|
||
|
if len(weights) == 0 {
|
||
|
weights = nil
|
||
|
}
|
||
|
return stat.Moment(r, xs, weights)
|
||
|
}
|
||
|
|
||
|
func MomentAbout(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
r = args[0].Float()
|
||
|
xs = JSFloatArray(args[1])
|
||
|
mean = args[2].Float()
|
||
|
weights = JSFloatArray(args[3])
|
||
|
)
|
||
|
if len(weights) == 0 {
|
||
|
weights = nil
|
||
|
}
|
||
|
return stat.MomentAbout(r, xs, mean, weights)
|
||
|
}
|
||
|
|
||
|
func PopMeanStdDev(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
xs = JSFloatArray(args[0])
|
||
|
weights = JSFloatArray(args[1])
|
||
|
)
|
||
|
if len(weights) == 0 {
|
||
|
weights = nil
|
||
|
}
|
||
|
mean, stdDev := stat.PopMeanStdDev(xs, weights)
|
||
|
return map[string]interface{}{
|
||
|
"mean": mean,
|
||
|
"stdDev": stdDev,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func PopMeanVariance(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
xs = JSFloatArray(args[0])
|
||
|
weights = JSFloatArray(args[1])
|
||
|
)
|
||
|
if len(weights) == 0 {
|
||
|
weights = nil
|
||
|
}
|
||
|
mean, variance := stat.PopMeanVariance(xs, weights)
|
||
|
return map[string]interface{}{
|
||
|
"mean": mean,
|
||
|
"variance": variance,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func PopStdDev(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
xs = JSFloatArray(args[0])
|
||
|
weights = JSFloatArray(args[1])
|
||
|
)
|
||
|
if len(weights) == 0 {
|
||
|
weights = nil
|
||
|
}
|
||
|
return stat.PopStdDev(xs, weights)
|
||
|
}
|
||
|
|
||
|
func PopVariance(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
xs = JSFloatArray(args[0])
|
||
|
weights = JSFloatArray(args[1])
|
||
|
)
|
||
|
if len(weights) == 0 {
|
||
|
weights = nil
|
||
|
}
|
||
|
return stat.PopVariance(xs, weights)
|
||
|
}
|
||
|
|
||
|
func Quantile(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
q = args[0].Float()
|
||
|
typ = args[1].String()
|
||
|
xs = JSFloatArray(args[2])
|
||
|
weights = JSFloatArray(args[3])
|
||
|
)
|
||
|
if typ == "empirical" {
|
||
|
return stat.Quantile(q, 1, xs, weights)
|
||
|
} else if typ == "linear" {
|
||
|
return stat.Quantile(q, 4, xs, weights)
|
||
|
} else {
|
||
|
return stat.Quantile(q, 2, xs, weights)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func RNoughtSquared(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
xs = JSFloatArray(args[0])
|
||
|
ys = JSFloatArray(args[1])
|
||
|
weights = JSFloatArray(args[2])
|
||
|
beta = args[3].Float()
|
||
|
)
|
||
|
if len(weights) == 0 {
|
||
|
weights = nil
|
||
|
}
|
||
|
return stat.RNoughtSquared(xs, ys, weights, beta)
|
||
|
}
|
||
|
|
||
|
func ROC(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
cutoffs = JSFloatArray(args[0])
|
||
|
y = JSFloatArray(args[1])
|
||
|
classes = JSBoolArray(args[2])
|
||
|
weights = JSFloatArray(args[3])
|
||
|
)
|
||
|
tpr, fpr, tresh := stat.ROC(cutoffs, y, classes, weights)
|
||
|
return map[string]interface{}{
|
||
|
"tpr": tpr,
|
||
|
"fpr": fpr,
|
||
|
"tresh": tresh,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func RSquared(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
xs = JSFloatArray(args[0])
|
||
|
ys = JSFloatArray(args[1])
|
||
|
weights = JSFloatArray(args[2])
|
||
|
alpha = args[3].Float()
|
||
|
beta = args[4].Float()
|
||
|
)
|
||
|
if len(weights) == 0 {
|
||
|
weights = nil
|
||
|
}
|
||
|
return stat.RSquared(xs, ys, weights, alpha, beta)
|
||
|
}
|
||
|
|
||
|
func RSquaredFrom(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
xs = JSFloatArray(args[0])
|
||
|
ys = JSFloatArray(args[1])
|
||
|
weights = JSFloatArray(args[2])
|
||
|
)
|
||
|
if len(weights) == 0 {
|
||
|
weights = nil
|
||
|
}
|
||
|
return stat.RSquaredFrom(xs, ys, weights)
|
||
|
}
|
||
|
|
||
|
func Skew(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
xs = JSFloatArray(args[0])
|
||
|
weights = JSFloatArray(args[1])
|
||
|
)
|
||
|
if len(weights) == 0 {
|
||
|
weights = nil
|
||
|
}
|
||
|
return stat.Skew(xs, weights)
|
||
|
}
|
||
|
|
||
|
func SortWeighted(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
xs = JSFloatArray(args[0])
|
||
|
weights = JSFloatArray(args[1])
|
||
|
)
|
||
|
if len(weights) == 0 {
|
||
|
weights = nil
|
||
|
}
|
||
|
stat.SortWeighted(xs, weights)
|
||
|
return xs
|
||
|
}
|
||
|
|
||
|
func SortWeightedLabeled(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
xs = JSFloatArray(args[0])
|
||
|
labels = JSBoolArray(args[1])
|
||
|
weights = JSFloatArray(args[2])
|
||
|
)
|
||
|
if len(weights) == 0 {
|
||
|
weights = nil
|
||
|
}
|
||
|
stat.SortWeightedLabeled(xs, labels, weights)
|
||
|
return map[string]interface{}{
|
||
|
"xs": xs,
|
||
|
"labels": labels,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func StdDev(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
xs = JSFloatArray(args[0])
|
||
|
weights = JSFloatArray(args[1])
|
||
|
)
|
||
|
if len(weights) == 0 {
|
||
|
weights = nil
|
||
|
}
|
||
|
return stat.StdDev(xs, weights)
|
||
|
}
|
||
|
|
||
|
func StdErr(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
std = args[0].Float()
|
||
|
size = args[1].Float()
|
||
|
)
|
||
|
return stat.StdErr(std, size)
|
||
|
}
|
||
|
|
||
|
func StdScore(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
x = args[0].Float()
|
||
|
mean = args[1].Float()
|
||
|
std = args[2].Float()
|
||
|
)
|
||
|
return stat.StdScore(x, mean, std)
|
||
|
}
|
||
|
|
||
|
func TOC(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
classes = JSBoolArray(args[0])
|
||
|
weights = JSFloatArray(args[1])
|
||
|
)
|
||
|
min, ntp, max := stat.TOC(classes, weights)
|
||
|
return map[string]interface{}{
|
||
|
"min": min,
|
||
|
"ntp": ntp,
|
||
|
"max": max,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func Variance(this js.Value, args []js.Value) interface{} {
|
||
|
var (
|
||
|
xs = JSFloatArray(args[0])
|
||
|
weights = JSFloatArray(args[1])
|
||
|
)
|
||
|
if len(weights) == 0 {
|
||
|
weights = nil
|
||
|
}
|
||
|
return stat.Variance(xs, weights)
|
||
|
}
|