mirror of
https://gitlab.com/pulsechaincom/erigon-pulse.git
synced 2024-12-29 07:07:16 +00:00
GSA simplify and more examples (#402)
This commit is contained in:
parent
8846b406eb
commit
dff0f93abb
@ -9,16 +9,19 @@ import (
|
|||||||
|
|
||||||
func TestExampleGSA(t *testing.T) {
|
func TestExampleGSA(t *testing.T) {
|
||||||
R := [][]byte{
|
R := [][]byte{
|
||||||
[]byte("hihihi"),
|
[]byte("hihi"),
|
||||||
[]byte("hihihi"),
|
[]byte("alexhihialex"),
|
||||||
[]byte("hihihi"),
|
[]byte("alex"),
|
||||||
}
|
}
|
||||||
str, n := ConcatAll(R)
|
str, n := ConcatAll(R)
|
||||||
sa := make([]uint, n)
|
sa := make([]uint, n)
|
||||||
lcp := make([]int, n)
|
lcp := make([]int, n)
|
||||||
da := make([]int32, n)
|
da := make([]int32, n)
|
||||||
_ = GSA(str, sa, lcp, da)
|
_ = GSA(str, sa, lcp, da)
|
||||||
PrintArrays(str, sa, lcp, da, n)
|
|
||||||
|
PrintArrays(str, sa, lcp, da)
|
||||||
|
gsa := SA2GSA(sa, da)
|
||||||
|
_ = gsa
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGSA(t *testing.T) {
|
func TestGSA(t *testing.T) {
|
||||||
|
@ -13,13 +13,12 @@ import (
|
|||||||
// Implementation from https://github.com/felipelouza/gsufsort
|
// Implementation from https://github.com/felipelouza/gsufsort
|
||||||
// see also: https://almob.biomedcentral.com/track/pdf/10.1186/s13015-020-00177-y.pdf
|
// see also: https://almob.biomedcentral.com/track/pdf/10.1186/s13015-020-00177-y.pdf
|
||||||
// see also: https://almob.biomedcentral.com/track/pdf/10.1186/s13015-017-0117-9.pdf
|
// see also: https://almob.biomedcentral.com/track/pdf/10.1186/s13015-017-0117-9.pdf
|
||||||
func PrintArrays(str []byte, sa []uint, lcp []int, da []int32, n int) {
|
func PrintArrays(str []byte, sa []uint, lcp []int, da []int32) {
|
||||||
// remove terminator
|
// remove terminator
|
||||||
|
n := len(sa) - 1
|
||||||
sa = sa[1:]
|
sa = sa[1:]
|
||||||
lcp = lcp[1:]
|
lcp = lcp[1:]
|
||||||
terminatorDa := da[0]
|
|
||||||
da = da[1:]
|
da = da[1:]
|
||||||
n = n - 1
|
|
||||||
|
|
||||||
fmt.Printf("i\t")
|
fmt.Printf("i\t")
|
||||||
fmt.Printf("sa\t")
|
fmt.Printf("sa\t")
|
||||||
@ -39,13 +38,9 @@ func PrintArrays(str []byte, sa []uint, lcp []int, da []int32, n int) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if da != nil { // gsa
|
if da != nil { // gsa
|
||||||
pos := uint(terminatorDa)
|
|
||||||
if da[i] > 0 {
|
|
||||||
pos = sa[da[i]-1]
|
|
||||||
}
|
|
||||||
value := sa[i]
|
value := sa[i]
|
||||||
if da[i] != 0 {
|
if da[i] != 0 {
|
||||||
value = sa[i] - pos - 1
|
value = sa[i] - sa[da[i]-1] - 1
|
||||||
}
|
}
|
||||||
fmt.Printf("(%d %d)\t", da[i], value)
|
fmt.Printf("(%d %d)\t", da[i], value)
|
||||||
}
|
}
|
||||||
@ -67,6 +62,26 @@ func PrintArrays(str []byte, sa []uint, lcp []int, da []int32, n int) {
|
|||||||
fmt.Printf("\n")
|
fmt.Printf("\n")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//nolint
|
||||||
|
// SA2GSA - example func to convert SA+DA to GSA
|
||||||
|
func SA2GSA(sa []uint, da []int32) []uint {
|
||||||
|
gsa := make([]uint, len(sa))
|
||||||
|
copy(gsa, sa)
|
||||||
|
|
||||||
|
// remove terminator
|
||||||
|
sa = sa[1:]
|
||||||
|
da = da[1:]
|
||||||
|
n := len(sa) - 1
|
||||||
|
|
||||||
|
for i := 0; i < n; i++ {
|
||||||
|
if da[i] != 0 {
|
||||||
|
gsa[i] = sa[i] - sa[da[i]-1] - 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return gsa
|
||||||
|
}
|
||||||
|
|
||||||
func GSA(data []byte, sa []uint, lcp []int, da []int32) error {
|
func GSA(data []byte, sa []uint, lcp []int, da []int32) error {
|
||||||
tPtr := unsafe.Pointer(&data[0]) // source "text"
|
tPtr := unsafe.Pointer(&data[0]) // source "text"
|
||||||
var lcpPtr, saPtr, daPtr unsafe.Pointer
|
var lcpPtr, saPtr, daPtr unsafe.Pointer
|
||||||
|
Loading…
Reference in New Issue
Block a user