KevinStephenson
Adding in weaviate code
b110593
raw
history blame
2.16 kB
// _ _
// __ _____ __ ___ ___ __ _| |_ ___
// \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \
// \ V V / __/ (_| |\ V /| | (_| | || __/
// \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___|
//
// Copyright © 2016 - 2024 Weaviate B.V. All rights reserved.
//
// CONTACT: [email protected]
//
package common
import (
"context"
"sync"
"github.com/weaviate/weaviate/adapters/repos/db/priorityqueue"
)
type VectorSlice struct {
Slice []float32
Mem []float32
Buff8 []byte
Buff []byte
}
type (
VectorForID[T float32 | byte | uint64] func(ctx context.Context, id uint64) ([]T, error)
TempVectorForID func(ctx context.Context, id uint64, container *VectorSlice) ([]float32, error)
MultiVectorForID func(ctx context.Context, ids []uint64) ([][]float32, []error)
)
type TempVectorsPool struct {
pool *sync.Pool
}
func NewTempVectorsPool() *TempVectorsPool {
return &TempVectorsPool{
pool: &sync.Pool{
New: func() interface{} {
return &VectorSlice{
Mem: nil,
Buff8: make([]byte, 8),
Buff: nil,
Slice: nil,
}
},
},
}
}
func (pool *TempVectorsPool) Get(capacity int) *VectorSlice {
container := pool.pool.Get().(*VectorSlice)
if len(container.Slice) >= capacity {
container.Slice = container.Mem[:capacity]
} else {
container.Mem = make([]float32, capacity)
container.Slice = container.Mem[:capacity]
}
return container
}
func (pool *TempVectorsPool) Put(container *VectorSlice) {
pool.pool.Put(container)
}
type PqMaxPool struct {
pool *sync.Pool
}
func NewPqMaxPool(defaultCap int) *PqMaxPool {
return &PqMaxPool{
pool: &sync.Pool{
New: func() interface{} {
return priorityqueue.NewMax[any](defaultCap)
},
},
}
}
func (pqh *PqMaxPool) GetMax(capacity int) *priorityqueue.Queue[any] {
pq := pqh.pool.Get().(*priorityqueue.Queue[any])
if pq.Cap() < capacity {
pq.ResetCap(capacity)
} else {
pq.Reset()
}
return pq
}
func (pqh *PqMaxPool) Put(pq *priorityqueue.Queue[any]) {
pqh.pool.Put(pq)
}