-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmathops.go
132 lines (112 loc) · 3.03 KB
/
mathops.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
126
127
128
129
130
131
132
package tfcgo
import (
"fmt"
"reflect"
"github.com/gonum/floats"
tf "github.com/tensorflow/tensorflow/tensorflow/go"
"github.com/tensorflow/tensorflow/tensorflow/go/op"
)
//SumOfSquares - accepts a value (expecting [][]float64) and returns sum of squares
func SumOfSquares(s *op.Scope, value interface{}) (*tf.Tensor, tf.Output, error) {
t, err := tf.NewTensor(value)
if err != nil {
return nil, tf.Output{}, err
}
var squaredData []float64
switch reflect.TypeOf(t.Value()).Kind() {
case reflect.Slice:
tensorData := t.Value().([][]float64)
for _, f := range tensorData {
norm := floats.Norm(f, 2)
squaredData = append(squaredData, norm*norm)
}
}
return MakeTensorAndOutput(s, squaredData)
}
//Log - accepts a tensor of [][]float64 and squares []float64[0]
func Log(s *op.Scope, value interface{}) (*tf.Tensor, tf.Output, error) {
t, err := tf.NewTensor(value)
if err != nil {
return nil, tf.Output{}, err
}
var sData []float64
switch reflect.TypeOf(t.Value()).Kind() {
case reflect.Slice:
tensorData := t.Value().([][]float64)
for _, f := range tensorData {
log := floats.LogSumExp(f)
sData = append(sData, log)
}
}
return MakeTensorAndOutput(s, sData)
}
//Square - accepts a tensor of [][]float64 and squares []float64[0]
func Square(s *op.Scope, value interface{}) (*tf.Tensor, tf.Output, error) {
t, err := tf.NewTensor(value)
if err != nil {
return nil, tf.Output{}, err
}
var squaredData [][]float64
switch reflect.TypeOf(t.Value()).Kind() {
case reflect.Slice:
tensorData := t.Value().([][]float64)
for _, f := range tensorData {
var square []float64
square = append(square, f[0]*f[0])
squaredData = append(squaredData, square)
}
}
return MakeTensorAndOutput(s, squaredData)
}
//Square - accepts a tensor of [][]float64 and squares []float64[0]
func SquareT(t *tf.Tensor) (*tf.Tensor, error) {
var squaredData [][]float64
switch reflect.TypeOf(t.Value()).Kind() {
case reflect.Slice:
tensorData := t.Value().([][]float64)
for _, f := range tensorData {
var square []float64
square = append(square, f[0]*f[0])
squaredData = append(squaredData, square)
}
}
tensor, e := tf.NewTensor(squaredData)
if e != nil {
return nil, e
}
return tensor, nil
}
//ReduceMean - mean accross elements
func ReduceMean(t *tf.Tensor) (*tf.Tensor, error) {
var meanData []float64
switch reflect.TypeOf(t.Value()).Kind() {
case reflect.Slice:
tensorData := t.Value().([][]float64)
for i, f := range tensorData {
var mean float64
//mean += float64(i) * f
fmt.Println(i, f)
meanData = append(meanData, mean)
}
}
tensor, e := tf.NewTensor(meanData)
if e != nil {
return nil, e
}
return tensor, nil
}
func RandomSample(t *tf.Tensor) (*tf.Tensor, error) {
//var randomData [][]float64
tensorData := t.Value().([][]float64)
// for i, f := range tensorData {
// var mean float64
// //mean += float64(i) * f
// fmt.Println(i, f)
// meanData = append(meanData, mean)
// }
tensor, e := tf.NewTensor(tensorData)
if e != nil {
return nil, e
}
return tensor, nil
}