mirror of
https://github.com/metabarcoding/obitools4.git
synced 2026-05-01 12:30:39 +00:00
Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e298daeef9 | |||
| d9e6f67a6e | |||
| f036c7fa96 | |||
| e33665e716 | |||
| c955a614ca | |||
| f19065261e | |||
| 3e349e92e1 | |||
| a4ce24a418 | |||
| c7816973a6 |
@@ -47,7 +47,7 @@ func Encode4mer(seq *obiseq.BioSequence, buffer *[]byte) []byte {
|
|||||||
length := slength - 3
|
length := slength - 3
|
||||||
rawseq := seq.Sequence()
|
rawseq := seq.Sequence()
|
||||||
|
|
||||||
if length < 0 {
|
if length <= 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+87
-4
@@ -141,6 +141,69 @@ func LuaWorker(proto *lua.FunctionProto) obiseq.SeqWorker {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LuaSliceWorker creates a SeqSliceWorker that calls the Lua function
|
||||||
|
// named "slice_worker". Unlike LuaWorker, the entire batch (BioSequenceSlice)
|
||||||
|
// is passed to the Lua function at once, enabling batch-level processing
|
||||||
|
// (e.g. a single HTTP request per batch instead of one per sequence).
|
||||||
|
//
|
||||||
|
// The Lua function signature:
|
||||||
|
//
|
||||||
|
// function slice_worker(slice) -- receives a BioSequenceSlice
|
||||||
|
// -- process the batch
|
||||||
|
// return slice -- returns a BioSequenceSlice (or nil)
|
||||||
|
// end
|
||||||
|
func LuaSliceWorker(proto *lua.FunctionProto) obiseq.SeqSliceWorker {
|
||||||
|
interpreter := NewInterpreter()
|
||||||
|
lfunc := interpreter.NewFunctionFromProto(proto)
|
||||||
|
interpreter.Push(lfunc)
|
||||||
|
err := interpreter.PCall(0, lua.MultRet, nil)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Error in executing the lua script: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
result := interpreter.GetGlobal("slice_worker")
|
||||||
|
|
||||||
|
if lua_worker, ok := result.(*lua.LFunction); ok {
|
||||||
|
f := func(slice obiseq.BioSequenceSlice) (obiseq.BioSequenceSlice, error) {
|
||||||
|
if err := interpreter.CallByParam(lua.P{
|
||||||
|
Fn: lua_worker,
|
||||||
|
NRet: 1,
|
||||||
|
Protect: true,
|
||||||
|
}, obiseqslice2Lua(interpreter, &slice)); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
lreponse := interpreter.Get(-1)
|
||||||
|
defer interpreter.Pop(1)
|
||||||
|
|
||||||
|
if reponse, ok := lreponse.(*lua.LUserData); ok {
|
||||||
|
s := reponse.Value
|
||||||
|
switch val := s.(type) {
|
||||||
|
case *obiseq.BioSequenceSlice:
|
||||||
|
return *val, nil
|
||||||
|
case *obiseq.BioSequence:
|
||||||
|
return obiseq.BioSequenceSlice{val}, nil
|
||||||
|
default:
|
||||||
|
r := reflect.TypeOf(val)
|
||||||
|
return nil, fmt.Errorf("slice_worker function doesn't return the correct type %s", r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, ok = lreponse.(*lua.LNilType); ok {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, fmt.Errorf("slice_worker function doesn't return the correct type %T", lreponse)
|
||||||
|
}
|
||||||
|
|
||||||
|
return f
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Fatalf("The slice_worker object is not a function")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// LuaProcessor processes a Lua script on a sequence iterator and returns a new iterator.
|
// LuaProcessor processes a Lua script on a sequence iterator and returns a new iterator.
|
||||||
//
|
//
|
||||||
// Parameters:
|
// Parameters:
|
||||||
@@ -216,11 +279,27 @@ func LuaProcessor(iterator obiiter.IBioSequence, name, program string, breakOnEr
|
|||||||
|
|
||||||
}()
|
}()
|
||||||
|
|
||||||
ff := func(iterator obiiter.IBioSequence) {
|
// Detect whether the script defines slice_worker (batch-level) or worker (per-sequence).
|
||||||
w := LuaWorker(proto)
|
hasSliceWorker := func() bool {
|
||||||
sw := obiseq.SeqToSliceWorker(w, false)
|
interpreter := NewInterpreter()
|
||||||
|
lfunc := interpreter.NewFunctionFromProto(proto)
|
||||||
|
interpreter.Push(lfunc)
|
||||||
|
if err := interpreter.PCall(0, lua.MultRet, nil); err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
result := interpreter.GetGlobal("slice_worker")
|
||||||
|
interpreter.Close()
|
||||||
|
_, ok := result.(*lua.LFunction)
|
||||||
|
return ok
|
||||||
|
}()
|
||||||
|
|
||||||
// iterator = iterator.SortBatches()
|
ff := func(iterator obiiter.IBioSequence) {
|
||||||
|
var sw obiseq.SeqSliceWorker
|
||||||
|
if hasSliceWorker {
|
||||||
|
sw = LuaSliceWorker(proto)
|
||||||
|
} else {
|
||||||
|
sw = obiseq.SeqToSliceWorker(LuaWorker(proto), false)
|
||||||
|
}
|
||||||
|
|
||||||
for iterator.Next() {
|
for iterator.Next() {
|
||||||
seqs := iterator.Get()
|
seqs := iterator.Get()
|
||||||
@@ -235,6 +314,10 @@ func LuaProcessor(iterator obiiter.IBioSequence, name, program string, breakOnEr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ns == nil {
|
||||||
|
ns = obiseq.BioSequenceSlice{}
|
||||||
|
}
|
||||||
|
|
||||||
newIter.Push(obiiter.MakeBioSequenceBatch(seqs.Source(), seqs.Order(), ns))
|
newIter.Push(obiiter.MakeBioSequenceBatch(seqs.Source(), seqs.Order(), ns))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package obioptions
|
|||||||
// Version is automatically updated by the Makefile from version.txt
|
// Version is automatically updated by the Makefile from version.txt
|
||||||
// The patch number (third digit) is incremented on each push to the repository
|
// The patch number (third digit) is incremented on each push to the repository
|
||||||
|
|
||||||
var _Version = "Release 4.4.34"
|
var _Version = "Release 4.4.37"
|
||||||
|
|
||||||
// Version returns the version of the obitools package.
|
// Version returns the version of the obitools package.
|
||||||
//
|
//
|
||||||
|
|||||||
+1
-1
@@ -1 +1 @@
|
|||||||
4.4.34
|
4.4.37
|
||||||
|
|||||||
Reference in New Issue
Block a user