/
vectorb.go
153 lines (123 loc) · 2.86 KB
/
vectorb.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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
// Package vlib provides some trivial functions for vector of int,float64,complex128 and bits. Each corresponding vector is extended
// from the standard array of data types. Hence it can be type-casted anytime and interface with other libraries
package vlib
import (
// "os"
"log"
"regexp"
"strconv"
"strings"
)
func (v VectorB) Size() int {
return len(v)
}
func (v VectorB) Len() int {
return v.Size()
}
func (v *VectorB) Resize(size int) {
// Only append etc length
length := len(*v)
extra := (size - length)
if extra > 0 {
tailvec := NewVectorB(extra)
*v = append(*v, tailvec...)
}
//copy(*v, Vector(make([]int, size)))
}
func (v VectorB) Clone() VectorB {
result := NewVectorB(v.Size())
copy(result, v)
return result
}
func (v VectorB) Scale2n(n uint) VectorB {
// Only append etc length
result := v.Clone()
for i := 0; i < len(v); i++ {
result[i] = result[i] << n
}
return result
//copy(*v, Vector(make([]int, size)))
}
func (v VectorB) ErrorCount(compare VectorB) int {
errors := 0
for i := range v {
if v[i] != compare[i] {
errors++
}
}
return errors
}
func (v VectorB) Scale(n int) VectorI {
// Only append etc length
result := NewVectorI(v.Size())
for i := 0; i < len(v); i++ {
result[i] = int(result[i]) * n
}
return result
//copy(*v, Vector(make([]int, size)))
}
func (v VectorB) Get(indx int) uint8 {
if indx < 0 || indx >= v.Len() {
log.Panicln("VectorF::Get() Index out of Bounds.. ")
}
return v[indx]
}
func (v VectorB) At(indx VectorI) VectorB {
result := NewVectorB(v.Size())
for i := 0; i < v.Len(); i++ {
result[i] = v.Get(indx[i])
}
return result
}
// Does elementwise XOR addition between vectors
func ElemAddB(in1, in2 VectorB) VectorB {
size := len(in1)
result := NewVectorB(size)
for i := 0; i < size; i++ {
// bool(in1[i])
if in1[i] == 1 && in2[i] == 1 {
result[i] = 0
} else if in1[i] == 1 || in2[i] == 1 {
result[i] = 1
}
}
return result
}
// Does elementwise Multiplication (AND operator) addition between vectors
func ElemMultB(in1, in2 VectorB) VectorB {
size := len(in1)
result := NewVectorB(size)
for i := 0; i < size; i++ {
if in1[i] == 1 && in2[i] == 1 {
result[i] = 1
} else {
result[i] = 0
}
}
return result
}
func NewVectorB(size int) VectorB {
return VectorB(make([]uint8, size))
}
func NewOnesB(size int) (v VectorB) {
result := VectorB(make([]uint8, size))
for i := 0; i < size; i++ {
result[i] = 1
}
return result
}
func ToVectorB(str string) VectorB {
str = strings.TrimSpace(str)
var exp string = "[.|;&,: ]+"
regx, _ := regexp.Compile(exp)
bitstrlist := regx.Split(str, -1)
result := NewVectorB(len(bitstrlist))
for cnt, bitstr := range bitstrlist {
// if bitstr != "" {
bit, _ := strconv.ParseUint(bitstr, 10, 1)
result[cnt] = uint8(bit)
// fmt.Printf("\n %d , %s , %d => %d", cnt, bitstr, bit, result[cnt])
// }
}
return result
}