-
Notifications
You must be signed in to change notification settings - Fork 0
/
types.go
79 lines (65 loc) · 1.75 KB
/
types.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
package julia
import "fmt"
// PrimitiveTypes are type constraint on julia input
type PrimitiveTypes interface {
~bool |
~uint8 | ~uint16 | ~uint32 | ~uint64 |
~int8 | ~int16 | ~int32 | ~int64 |
~float32 | ~float64
}
// PrimitiveSliceTypes are type constraints on julia inputs
type PrimitiveSliceTypes interface {
~[]bool |
~[]uint8 | ~[]uint16 | ~[]uint32 | ~[]uint64 |
~[]int8 | ~[]int16 | ~[]int32 | ~[]int64 |
~[]float32 | ~[]float64
}
// PrimitivePointerTypes are type constraints on julia output
type PrimitivePointerTypes interface {
~*bool |
~*uint8 | ~*uint16 | ~*uint32 | ~*uint64 |
~*int8 | ~*int16 | ~*int32 | ~*int64 |
~*float32 | ~*float64
}
// MatTypes represents constraints on parametrized Mat type
// to be uses as both julia inputs and outputs
type MatTypes interface {
*Mat[bool] |
*Mat[uint8] | *Mat[uint16] | *Mat[uint32] | *Mat[uint64] |
*Mat[int8] | *Mat[int16] | *Mat[int32] | *Mat[int64] |
*Mat[float32] | *Mat[float64]
}
// Mat represents the matrix for supported data types
// parameterized by primitive types
type Mat[T PrimitiveTypes] struct {
elms []T
dims []int
}
func (g *Mat[T]) GetElms() []T {
return g.elms
}
func (g *Mat[T]) GetDims() []int {
return g.dims
}
// NewMat creates a new instance of matrix and validates if the length of
// elements is satisfied by the dimensions
func NewMat[T PrimitiveTypes](values []T, dims ...int) (*Mat[T], error) {
if len(dims) == 0 {
dims = []int{len(values)}
}
m := &Mat[T]{
dims: dims,
elms: values,
}
if len(m.dims) == 0 {
return nil, fmt.Errorf("invalid dimensions")
}
numElements, err := dim2NumElms(m.dims)
if err != nil {
return nil, err
}
if numElements != len(values) {
return nil, fmt.Errorf("dims and len elms mismatch")
}
return m, nil
}