|
1 | 1 | package golsv
|
2 | 2 |
|
3 | 3 | import (
|
| 4 | + "math/rand" |
4 | 5 | "reflect"
|
5 | 6 | "testing"
|
6 | 7 | )
|
7 | 8 |
|
8 |
| -func TestBinaryMatrix_BinaryVectorToMatrix(t *testing.T) { |
| 9 | +func TestBinaryVectorAdd(t *testing.T) { |
| 10 | + tests := []struct { |
| 11 | + a, b, want BinaryVector |
| 12 | + }{ |
| 13 | + {a: NewBinaryVectorFromString("0000"), b: NewBinaryVectorFromString("0000"), want: NewBinaryVectorFromString("0000")}, |
| 14 | + {a: NewBinaryVectorFromString("0000"), b: NewBinaryVectorFromString("0001"), want: NewBinaryVectorFromString("0001")}, |
| 15 | + {a: NewBinaryVectorFromString("0001"), b: NewBinaryVectorFromString("0001"), want: NewBinaryVectorFromString("0000")}, |
| 16 | + {a: NewBinaryVectorFromString("0001"), b: NewBinaryVectorFromString("1001"), want: NewBinaryVectorFromString("1000")}, |
| 17 | + } |
| 18 | + for i, tt := range tests { |
| 19 | + got := tt.a.Add(tt.b) |
| 20 | + if !reflect.DeepEqual(tt.want, got) { |
| 21 | + t.Errorf("%d: got=%v want=%v", i, got, tt.want) |
| 22 | + } |
| 23 | + } |
| 24 | +} |
| 25 | + |
| 26 | +func TestBinaryVectorMatrix(t *testing.T) { |
9 | 27 | tests := []struct {
|
10 | 28 | name string
|
11 | 29 | v BinaryVector
|
@@ -43,6 +61,63 @@ func TestBinaryMatrix_BinaryVectorToMatrix(t *testing.T) {
|
43 | 61 | }
|
44 | 62 | }
|
45 | 63 |
|
| 64 | +func TestBinaryVectorProject(t *testing.T) { |
| 65 | + tests := []struct { |
| 66 | + v BinaryVector |
| 67 | + proj []int |
| 68 | + want BinaryVector |
| 69 | + }{ |
| 70 | + {v: NewBinaryVectorFromString("0000"), proj: []int{0, 1, 2}, want: NewBinaryVectorFromString("000")}, |
| 71 | + {v: NewBinaryVectorFromString("0001"), proj: []int{0, 1, 2}, want: NewBinaryVectorFromString("000")}, |
| 72 | + {v: NewBinaryVectorFromString("0011"), proj: []int{0, 1, 2}, want: NewBinaryVectorFromString("001")}, |
| 73 | + {v: NewBinaryVectorFromString("1011"), proj: []int{1, 2}, want: NewBinaryVectorFromString("01")}, |
| 74 | + } |
| 75 | + for i, tt := range tests { |
| 76 | + hot := make(map[int]bool) |
| 77 | + for _, j := range tt.proj { |
| 78 | + hot[j] = true |
| 79 | + } |
| 80 | + predicate := func(i int) bool { |
| 81 | + _, ok := hot[i] |
| 82 | + return ok |
| 83 | + } |
| 84 | + got := tt.v.Project(len(tt.proj), predicate) |
| 85 | + if !reflect.DeepEqual(tt.want, got) { |
| 86 | + t.Errorf("%d: got=%v want=%v", i, got, tt.want) |
| 87 | + } |
| 88 | + } |
| 89 | +} |
| 90 | + |
| 91 | +func TestBinaryVectorRandomizeWithWeight(t *testing.T) { |
| 92 | + trials := 10 |
| 93 | + for i := 0; i < trials; i++ { |
| 94 | + n := 100 |
| 95 | + w := rand.Intn(n) |
| 96 | + v := NewBinaryVector(n) |
| 97 | + v.RandomizeWithWeight(w) |
| 98 | + if v.Weight() != w { |
| 99 | + t.Errorf("got=%d want=%d", v.Weight(), w) |
| 100 | + } |
| 101 | + } |
| 102 | +} |
| 103 | + |
| 104 | +func TestBinaryVectorWeight(t *testing.T) { |
| 105 | + tests := []struct { |
| 106 | + v BinaryVector |
| 107 | + want int |
| 108 | + }{ |
| 109 | + {v: NewBinaryVectorFromString("0000"), want: 0}, |
| 110 | + {v: NewBinaryVectorFromString("0001"), want: 1}, |
| 111 | + {v: NewBinaryVectorFromString("0011"), want: 2}, |
| 112 | + } |
| 113 | + for i, tt := range tests { |
| 114 | + got := tt.v.Weight() |
| 115 | + if got != tt.want { |
| 116 | + t.Errorf("%d: got=%d want=%d", i, got, tt.want) |
| 117 | + } |
| 118 | + } |
| 119 | +} |
| 120 | + |
46 | 121 | func TestBinaryMatrix_LinearCombination(t *testing.T) {
|
47 | 122 | tests := []struct {
|
48 | 123 | name string
|
@@ -172,63 +247,26 @@ func TestAllBinaryVectors(t *testing.T) {
|
172 | 247 | }
|
173 | 248 | }
|
174 | 249 |
|
175 |
| -func TestBinaryVectorAdd(t *testing.T) { |
176 |
| - tests := []struct { |
177 |
| - a, b, want BinaryVector |
178 |
| - }{ |
179 |
| - {a: NewBinaryVectorFromString("0000"), b: NewBinaryVectorFromString("0000"), want: NewBinaryVectorFromString("0000")}, |
180 |
| - {a: NewBinaryVectorFromString("0000"), b: NewBinaryVectorFromString("0001"), want: NewBinaryVectorFromString("0001")}, |
181 |
| - {a: NewBinaryVectorFromString("0001"), b: NewBinaryVectorFromString("0001"), want: NewBinaryVectorFromString("0000")}, |
182 |
| - {a: NewBinaryVectorFromString("0001"), b: NewBinaryVectorFromString("1001"), want: NewBinaryVectorFromString("1000")}, |
| 250 | +func TestEnumerateBinaryVectors(t *testing.T) { |
| 251 | + n := 3 |
| 252 | + res := make([]BinaryVector, 0) |
| 253 | + buf := NewBinaryVector(n) |
| 254 | + EnumerateBinaryVectors(n, buf, func() (continue_ bool) { |
| 255 | + res = append(res, buf.Clone()) |
| 256 | + return true |
| 257 | + }) |
| 258 | + expected := []BinaryVector{ |
| 259 | + NewBinaryVectorFromString("000"), |
| 260 | + NewBinaryVectorFromString("100"), |
| 261 | + NewBinaryVectorFromString("010"), |
| 262 | + NewBinaryVectorFromString("110"), |
| 263 | + NewBinaryVectorFromString("001"), |
| 264 | + NewBinaryVectorFromString("101"), |
| 265 | + NewBinaryVectorFromString("011"), |
| 266 | + NewBinaryVectorFromString("111"), |
183 | 267 | }
|
184 |
| - for i, tt := range tests { |
185 |
| - got := tt.a.Add(tt.b) |
186 |
| - if !reflect.DeepEqual(tt.want, got) { |
187 |
| - t.Errorf("%d: got=%v want=%v", i, got, tt.want) |
188 |
| - } |
| 268 | + if !reflect.DeepEqual(res, expected) { |
| 269 | + t.Errorf("got=%v want=%v", res, expected) |
189 | 270 | }
|
190 | 271 | }
|
191 | 272 |
|
192 |
| -func NewTestBinaryVectorWeightFromInts(t *testing.T) { |
193 |
| - tests := []struct { |
194 |
| - v BinaryVector |
195 |
| - want int |
196 |
| - }{ |
197 |
| - {v: NewBinaryVectorFromString("0000"), want: 0}, |
198 |
| - {v: NewBinaryVectorFromString("0001"), want: 1}, |
199 |
| - {v: NewBinaryVectorFromString("0011"), want: 2}, |
200 |
| - } |
201 |
| - for i, tt := range tests { |
202 |
| - got := tt.v.Weight() |
203 |
| - if got != tt.want { |
204 |
| - t.Errorf("%d: got=%d want=%d", i, got, tt.want) |
205 |
| - } |
206 |
| - } |
207 |
| -} |
208 |
| - |
209 |
| -func TestBinaryVectorProject(t *testing.T) { |
210 |
| - tests := []struct { |
211 |
| - v BinaryVector |
212 |
| - proj []int |
213 |
| - want BinaryVector |
214 |
| - }{ |
215 |
| - {v: NewBinaryVectorFromString("0000"), proj: []int{0, 1, 2}, want: NewBinaryVectorFromString("000")}, |
216 |
| - {v: NewBinaryVectorFromString("0001"), proj: []int{0, 1, 2}, want: NewBinaryVectorFromString("000")}, |
217 |
| - {v: NewBinaryVectorFromString("0011"), proj: []int{0, 1, 2}, want: NewBinaryVectorFromString("001")}, |
218 |
| - {v: NewBinaryVectorFromString("1011"), proj: []int{1, 2}, want: NewBinaryVectorFromString("01")}, |
219 |
| - } |
220 |
| - for i, tt := range tests { |
221 |
| - hot := make(map[int]bool) |
222 |
| - for _, j := range tt.proj { |
223 |
| - hot[j] = true |
224 |
| - } |
225 |
| - predicate := func(i int) bool { |
226 |
| - _, ok := hot[i] |
227 |
| - return ok |
228 |
| - } |
229 |
| - got := tt.v.Project(len(tt.proj), predicate) |
230 |
| - if !reflect.DeepEqual(tt.want, got) { |
231 |
| - t.Errorf("%d: got=%v want=%v", i, got, tt.want) |
232 |
| - } |
233 |
| - } |
234 |
| -} |
|
0 commit comments