Files
CHORUS/vendor/github.com/blevesearch/go-faiss/search_params.go
anthonyrawlins 9bdcbe0447 Integrate BACKBEAT SDK and resolve KACHING license validation
Major integrations and fixes:
- Added BACKBEAT SDK integration for P2P operation timing
- Implemented beat-aware status tracking for distributed operations
- Added Docker secrets support for secure license management
- Resolved KACHING license validation via HTTPS/TLS
- Updated docker-compose configuration for clean stack deployment
- Disabled rollback policies to prevent deployment failures
- Added license credential storage (CHORUS-DEV-MULTI-001)

Technical improvements:
- BACKBEAT P2P operation tracking with phase management
- Enhanced configuration system with file-based secrets
- Improved error handling for license validation
- Clean separation of KACHING and CHORUS deployment stacks

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-06 07:56:26 +10:00

114 lines
3.1 KiB
Go

package faiss
/*
#include <faiss/c_api/Index_c.h>
#include <faiss/c_api/IndexIVF_c.h>
#include <faiss/c_api/impl/AuxIndexStructures_c.h>
*/
import "C"
import (
"encoding/json"
"fmt"
)
type SearchParams struct {
sp *C.FaissSearchParameters
}
// Delete frees the memory associated with s.
func (s *SearchParams) Delete() {
if s == nil || s.sp == nil {
return
}
C.faiss_SearchParameters_free(s.sp)
}
type searchParamsIVF struct {
NprobePct float32 `json:"ivf_nprobe_pct,omitempty"`
MaxCodesPct float32 `json:"ivf_max_codes_pct,omitempty"`
}
// IVF Parameters used to override the index-time defaults for a specific query.
// Serve as the 'new' defaults for this query, unless overridden by search-time
// params.
type defaultSearchParamsIVF struct {
Nprobe int `json:"ivf_nprobe,omitempty"`
Nlist int `json:"ivf_nlist,omitempty"`
}
func (s *searchParamsIVF) Validate() error {
if s.NprobePct < 0 || s.NprobePct > 100 {
return fmt.Errorf("invalid IVF search params, ivf_nprobe_pct:%v, "+
"should be in range [0, 100]", s.NprobePct)
}
if s.MaxCodesPct < 0 || s.MaxCodesPct > 100 {
return fmt.Errorf("invalid IVF search params, ivf_max_codes_pct:%v, "+
"should be in range [0, 100]", s.MaxCodesPct)
}
return nil
}
func getNProbeFromSearchParams(params *SearchParams) int32 {
return int32(C.faiss_SearchParametersIVF_nprobe(params.sp))
}
// Returns a valid SearchParams object,
// thus caller must clean up the object
// by invoking Delete() method.
func NewSearchParams(idx Index, params json.RawMessage, sel *C.FaissIDSelector,
defaultParams *defaultSearchParamsIVF) (*SearchParams, error) {
rv := &SearchParams{}
if c := C.faiss_SearchParameters_new(&rv.sp, sel); c != 0 {
return nil, fmt.Errorf("failed to create faiss search params")
}
// check if the index is IVF and set the search params
if ivfIdx := C.faiss_IndexIVF_cast(idx.cPtr()); ivfIdx != nil {
rv.sp = C.faiss_SearchParametersIVF_cast(rv.sp)
if len(params) == 0 && sel == nil {
return rv, nil
}
var nlist, nprobe, nvecs, maxCodes int
nlist = int(C.faiss_IndexIVF_nlist(ivfIdx))
nprobe = int(C.faiss_IndexIVF_nprobe(ivfIdx))
nvecs = int(C.faiss_Index_ntotal(idx.cPtr()))
if defaultParams != nil {
if defaultParams.Nlist > 0 {
nlist = defaultParams.Nlist
}
if defaultParams.Nprobe > 0 {
nprobe = defaultParams.Nprobe
}
}
var ivfParams searchParamsIVF
if len(params) > 0 {
if err := json.Unmarshal(params, &ivfParams); err != nil {
rv.Delete()
return nil, fmt.Errorf("failed to unmarshal IVF search params, "+
"err:%v", err)
}
if err := ivfParams.Validate(); err != nil {
rv.Delete()
return nil, err
}
}
if ivfParams.NprobePct > 0 {
nprobe = max(int(float32(nlist)*(ivfParams.NprobePct/100)), 1)
}
if ivfParams.MaxCodesPct > 0 {
maxCodes = int(float32(nvecs) * (ivfParams.MaxCodesPct / 100))
} // else, maxCodes will be set to the default value of 0, which means no limit
if c := C.faiss_SearchParametersIVF_new_with(
&rv.sp,
sel,
C.size_t(nprobe),
C.size_t(maxCodes),
); c != 0 {
rv.Delete()
return nil, fmt.Errorf("failed to create faiss IVF search params")
}
}
return rv, nil
}