/******************************************************************************* * Copyright 上海赜睿信息科技有限公司(Zilliz) - All Rights Reserved * Unauthorized copying of this file, via any medium is strictly prohibited. * Proprietary and confidential. ******************************************************************************/ #ifndef FAISSEXECUTIONENGINE_CPP__ #define FAISSEXECUTIONENGINE_CPP__ #include #include #include #include #include #include #include #include #include "FaissExecutionEngine.h" namespace zilliz { namespace vecwise { namespace engine { template FaissExecutionEngine::FaissExecutionEngine(uint16_t dimension, const std::string& location) : pIndex_(faiss::index_factory(dimension, IndexTrait::RawIndexType)), location_(location) { } template FaissExecutionEngine::FaissExecutionEngine(std::shared_ptr index, const std::string& location) : pIndex_(index), location_(location) { } template Status FaissExecutionEngine::AddWithIds(long n, const float *xdata, const long *xids) { pIndex_->add_with_ids(n, xdata, xids); return Status::OK(); } template size_t FaissExecutionEngine::Count() const { return (size_t)(pIndex_->ntotal); } template size_t FaissExecutionEngine::Size() const { return (size_t)(Count() * pIndex_->d)*sizeof(float); } template size_t FaissExecutionEngine::PhysicalSize() const { return (size_t)(Count() * pIndex_->d)*sizeof(float); } template Status FaissExecutionEngine::Serialize() { write_index(pIndex_.get(), location_.c_str()); return Status::OK(); } template Status FaissExecutionEngine::Load() { auto index = zilliz::vecwise::cache::CpuCacheMgr::GetInstance()->GetIndex(location_); bool to_cache = false; if (!index) { index = read_index(location_); to_cache = true; LOG(DEBUG) << "Disk io from: " << location_; } pIndex_ = index->data(); if (to_cache) { Cache(); } return Status::OK(); } template Status FaissExecutionEngine::Merge(const std::string& location) { if (location == location_) { return Status::Error("Cannot Merge Self"); } auto to_merge = zilliz::vecwise::cache::CpuCacheMgr::GetInstance()->GetIndex(location); if (!to_merge) { to_merge = read_index(location); } auto file_index = dynamic_cast(to_merge->data().get()); pIndex_->add_with_ids(file_index->ntotal, dynamic_cast(file_index->index)->xb.data(), file_index->id_map.data()); return Status::OK(); } template typename FaissExecutionEngine::Ptr FaissExecutionEngine::BuildIndex(const std::string& location) { auto opd = std::make_shared(); opd->d = pIndex_->d; opd->index_type = IndexTrait::BuildIndexType; IndexBuilderPtr pBuilder = GetIndexBuilder(opd); auto from_index = dynamic_cast(pIndex_.get()); auto index = pBuilder->build_all(from_index->ntotal, dynamic_cast(from_index->index)->xb.data(), from_index->id_map.data()); Ptr new_ee(new FaissExecutionEngine(index->data(), location)); new_ee->Serialize(); return new_ee; } template Status FaissExecutionEngine::Search(long n, const float *data, long k, float *distances, long *labels) const { pIndex_->search(n, data, k, distances, labels); return Status::OK(); } template Status FaissExecutionEngine::Cache() { zilliz::vecwise::cache::CpuCacheMgr::GetInstance( )->InsertItem(location_, std::make_shared(pIndex_)); return Status::OK(); } } // namespace engine } // namespace vecwise } // namespace zilliz #endif