2022-01-13 23:27:39 +01:00
|
|
|
package obiseq
|
|
|
|
|
|
|
|
import (
|
|
|
|
"log"
|
|
|
|
)
|
|
|
|
|
2022-02-21 19:00:23 +01:00
|
|
|
type SeqAnnotator func(*BioSequence)
|
2022-01-13 23:27:39 +01:00
|
|
|
|
2022-02-21 19:00:23 +01:00
|
|
|
type SeqWorker func(*BioSequence) *BioSequence
|
2022-01-13 23:27:39 +01:00
|
|
|
type SeqSliceWorker func(BioSequenceSlice) BioSequenceSlice
|
|
|
|
|
|
|
|
func AnnotatorToSeqWorker(function SeqAnnotator) SeqWorker {
|
2022-02-21 19:00:23 +01:00
|
|
|
f := func(seq *BioSequence) *BioSequence {
|
2022-01-13 23:27:39 +01:00
|
|
|
function(seq)
|
|
|
|
return seq
|
|
|
|
}
|
|
|
|
return f
|
|
|
|
}
|
|
|
|
|
|
|
|
func (iterator IBioSequence) MakeIWorker(worker SeqWorker, sizes ...int) IBioSequence {
|
|
|
|
buffsize := iterator.BufferSize()
|
|
|
|
|
|
|
|
if len(sizes) > 0 {
|
|
|
|
buffsize = sizes[0]
|
|
|
|
}
|
|
|
|
|
2022-01-14 17:32:12 +01:00
|
|
|
newIter := MakeIBioSequence(buffsize)
|
2022-01-13 23:27:39 +01:00
|
|
|
|
2022-01-14 17:32:12 +01:00
|
|
|
newIter.Add(1)
|
2022-01-13 23:27:39 +01:00
|
|
|
|
|
|
|
go func() {
|
2022-01-14 17:32:12 +01:00
|
|
|
newIter.Wait()
|
|
|
|
close(newIter.pointer.channel)
|
2022-01-13 23:27:39 +01:00
|
|
|
}()
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
for iterator.Next() {
|
|
|
|
seq := iterator.Get()
|
|
|
|
seq = worker(seq)
|
2022-01-14 17:32:12 +01:00
|
|
|
newIter.pointer.channel <- seq
|
2022-01-13 23:27:39 +01:00
|
|
|
}
|
2022-01-14 17:32:12 +01:00
|
|
|
newIter.Done()
|
2022-01-13 23:27:39 +01:00
|
|
|
}()
|
|
|
|
|
2022-01-14 17:32:12 +01:00
|
|
|
return newIter
|
2022-01-13 23:27:39 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
func (iterator IBioSequenceBatch) MakeIWorker(worker SeqWorker, sizes ...int) IBioSequenceBatch {
|
|
|
|
nworkers := 4
|
|
|
|
buffsize := iterator.BufferSize()
|
|
|
|
|
|
|
|
if len(sizes) > 0 {
|
|
|
|
nworkers = sizes[0]
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(sizes) > 1 {
|
|
|
|
buffsize = sizes[1]
|
|
|
|
}
|
|
|
|
|
2022-01-14 17:32:12 +01:00
|
|
|
newIter := MakeIBioSequenceBatch(buffsize)
|
2022-01-13 23:27:39 +01:00
|
|
|
|
2022-01-14 17:32:12 +01:00
|
|
|
newIter.Add(nworkers)
|
2022-01-13 23:27:39 +01:00
|
|
|
|
|
|
|
go func() {
|
2022-02-21 19:00:23 +01:00
|
|
|
newIter.WaitAndClose()
|
2022-01-13 23:27:39 +01:00
|
|
|
log.Println("End of the batch workers")
|
|
|
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
f := func(iterator IBioSequenceBatch) {
|
|
|
|
for iterator.Next() {
|
|
|
|
batch := iterator.Get()
|
|
|
|
for i, seq := range batch.slice {
|
|
|
|
batch.slice[i] = worker(seq)
|
|
|
|
}
|
2022-02-21 19:00:23 +01:00
|
|
|
newIter.Push(batch)
|
2022-01-13 23:27:39 +01:00
|
|
|
}
|
2022-01-14 17:32:12 +01:00
|
|
|
newIter.Done()
|
2022-01-13 23:27:39 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
log.Println("Start of the batch workers")
|
2022-01-14 23:11:36 +01:00
|
|
|
for i := 0; i < nworkers-1; i++ {
|
2022-01-13 23:27:39 +01:00
|
|
|
go f(iterator.Split())
|
|
|
|
}
|
2022-01-14 23:11:36 +01:00
|
|
|
go f(iterator)
|
2022-01-13 23:27:39 +01:00
|
|
|
|
2022-01-14 17:32:12 +01:00
|
|
|
return newIter
|
2022-01-13 23:27:39 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
func (iterator IBioSequenceBatch) MakeISliceWorker(worker SeqSliceWorker, sizes ...int) IBioSequenceBatch {
|
|
|
|
nworkers := 4
|
|
|
|
buffsize := iterator.BufferSize()
|
|
|
|
|
|
|
|
if len(sizes) > 0 {
|
|
|
|
nworkers = sizes[0]
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(sizes) > 1 {
|
|
|
|
buffsize = sizes[1]
|
|
|
|
}
|
|
|
|
|
2022-01-14 17:32:12 +01:00
|
|
|
newIter := MakeIBioSequenceBatch(buffsize)
|
2022-01-13 23:27:39 +01:00
|
|
|
|
2022-01-14 17:32:12 +01:00
|
|
|
newIter.Add(nworkers)
|
2022-01-13 23:27:39 +01:00
|
|
|
|
|
|
|
go func() {
|
2022-02-21 19:00:23 +01:00
|
|
|
newIter.WaitAndClose()
|
2022-01-13 23:27:39 +01:00
|
|
|
log.Println("End of the batch slice workers")
|
|
|
|
}()
|
|
|
|
|
|
|
|
f := func(iterator IBioSequenceBatch) {
|
|
|
|
for iterator.Next() {
|
|
|
|
batch := iterator.Get()
|
|
|
|
batch.slice = worker(batch.slice)
|
2022-01-14 17:32:12 +01:00
|
|
|
newIter.pointer.channel <- batch
|
2022-01-13 23:27:39 +01:00
|
|
|
}
|
2022-01-14 17:32:12 +01:00
|
|
|
newIter.Done()
|
2022-01-13 23:27:39 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
log.Println("Start of the batch slice workers")
|
2022-01-15 19:10:16 +01:00
|
|
|
for i := 0; i < nworkers-1; i++ {
|
2022-01-13 23:27:39 +01:00
|
|
|
go f(iterator.Split())
|
|
|
|
}
|
2022-01-14 23:11:36 +01:00
|
|
|
go f(iterator)
|
2022-01-13 23:27:39 +01:00
|
|
|
|
2022-01-14 17:32:12 +01:00
|
|
|
return newIter
|
2022-01-13 23:27:39 +01:00
|
|
|
}
|