-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbinary_markov.go
115 lines (98 loc) · 2.65 KB
/
binary_markov.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
package myanmartools
import (
"bufio"
"encoding/binary"
"fmt"
)
const (
//BinaryTag Magic number used to identify
//this object in byte slice
BinaryTag = 0x424D41524B4F5620
//BinaryVersion current serial format
//version number, used in assiciation with magic number
BinaryVersion = 0
)
//BinaryMarkov interface
type BinaryMarkov interface {
GetLogProbabilityDifference(i1 int, i2 int) float32
}
type binaryMarkovImpl struct {
logProbabilityDifferences [][]float32
}
func (bm *binaryMarkovImpl) GetLogProbabilityDifference(i1 int, i2 int) float32 {
return bm.logProbabilityDifferences[i1][i2]
}
//NewBinaryMarkov return new instance of BinaryMarkov implementation
func NewBinaryMarkov(datReader *bufio.Reader) BinaryMarkov {
binaryTag := readLong(datReader)
if BinaryTag != binaryTag {
panic(fmt.Errorf("Unexpected magic number; expected %X but got %X", BinaryTag, binaryTag))
}
binaryVersion := readInt(datReader)
if BinaryVersion != binaryVersion {
panic(fmt.Errorf("Unexpected serial version number; expected %X but got %X", BinaryVersion, binaryVersion))
}
size := readShort(datReader)
var logProbabilityDifferences [][]float32
var i int16
for i = 0; i < size; i++ {
logProbabilityDifferences = append(logProbabilityDifferences, make([]float32, size, size))
}
var i1 int16
for i1 = 0; i1 < size; i1++ {
entries := readShort(datReader)
var fallback float32 = 0.0
if entries != 0 {
fallback = readFloat(datReader)
}
var next int16 = -1
var i2 int16
for i2 = 0; i2 < size; i2++ {
if entries > 0 && next < i2 {
next = readShort(datReader)
entries--
}
if next == i2 {
logProbabilityDifferences[i1][i2] = readFloat(datReader)
} else {
logProbabilityDifferences[i1][i2] = fallback
}
}
}
return &binaryMarkovImpl{logProbabilityDifferences: logProbabilityDifferences}
}
func readLong(reader *bufio.Reader) int64 {
var result int64
err := binary.Read(reader, binary.BigEndian, &result)
panicOnError(err)
return result
}
func readShort(reader *bufio.Reader) int16 {
var result int16
err := binary.Read(reader, binary.BigEndian, &result)
panicOnError(err)
return result
}
func readInt(reader *bufio.Reader) int {
var result int32
err := binary.Read(reader, binary.BigEndian, &result)
panicOnError(err)
return int(result)
}
func readFloat(reader *bufio.Reader) float32 {
var result float32
err := binary.Read(reader, binary.BigEndian, &result)
panicOnError(err)
return result
}
func readFloat64(reader *bufio.Reader) float64 {
var result float64
err := binary.Read(reader, binary.BigEndian, &result)
panicOnError(err)
return result
}
func panicOnError(err error) {
if err != nil {
panic(err)
}
}