Impl IndexPreTransform for c_api (#1816)

Summary:
This PR extends c_api for IndexPreTransform

Pull Request resolved: https://github.com/facebookresearch/faiss/pull/1816

Reviewed By: beauby

Differential Revision: D27904597

Pulled By: mdouze

fbshipit-source-id: b54dfffcc97879fdf66f9a8a26e9b7840a2e97f2
This commit is contained in:
Alexander Andreev
2021-04-22 05:27:36 -07:00
committed by Facebook GitHub Bot
parent b209361f7b
commit d640c6fcda
8 changed files with 462 additions and 4 deletions
+1
View File
@@ -17,6 +17,7 @@ set(FAISS_C_SRC
IndexIVF_c.cpp
IndexLSH_c.cpp
IndexPreTransform_c.cpp
VectorTransform_c.cpp
IndexShards_c.cpp
Index_c.cpp
IndexScalarQuantizer_c.cpp
+40
View File
@@ -10,12 +10,52 @@
#include "IndexPreTransform_c.h"
#include <faiss/IndexPreTransform.h>
#include <faiss/VectorTransform.h>
#include "macros_impl.h"
using faiss::Index;
using faiss::IndexPreTransform;
using faiss::VectorTransform;
extern "C" {
DEFINE_DESTRUCTOR(IndexPreTransform)
DEFINE_INDEX_DOWNCAST(IndexPreTransform)
DEFINE_GETTER_PERMISSIVE(IndexPreTransform, FaissIndex*, index)
DEFINE_GETTER(IndexPreTransform, int, own_fields)
DEFINE_SETTER(IndexPreTransform, int, own_fields)
int faiss_IndexPreTransform_new(FaissIndexPreTransform** p_index) {
try {
*p_index = reinterpret_cast<FaissIndexPreTransform*>(
new IndexPreTransform());
}
CATCH_AND_HANDLE
}
int faiss_IndexPreTransform_new_with(
FaissIndexPreTransform** p_index,
FaissIndex* index) {
try {
auto ind = reinterpret_cast<Index*>(index);
*p_index = reinterpret_cast<FaissIndexPreTransform*>(
new IndexPreTransform(ind));
}
CATCH_AND_HANDLE
}
int faiss_IndexPreTransform_new_with_transform(
FaissIndexPreTransform** p_index,
FaissVectorTransform* ltrans,
FaissIndex* index) {
try {
auto lt = reinterpret_cast<VectorTransform*>(ltrans);
auto ind = reinterpret_cast<Index*>(index);
*p_index = reinterpret_cast<FaissIndexPreTransform*>(
new IndexPreTransform(lt, ind));
}
CATCH_AND_HANDLE
}
}
+16 -1
View File
@@ -12,17 +12,32 @@
#define FAISS_INDEX_PRETRANSFORM_C_H
#include "Index_c.h"
#include "VectorTransform_c.h"
#include "faiss_c.h"
#ifdef __cplusplus
extern "C" {
#endif
FAISS_DECLARE_CLASS(IndexPreTransform)
/** Index that applies a LinearTransform transform on vectors before
* handing them over to a sub-index */
FAISS_DECLARE_CLASS_INHERITED(IndexPreTransform, Index)
FAISS_DECLARE_DESTRUCTOR(IndexPreTransform)
FAISS_DECLARE_INDEX_DOWNCAST(IndexPreTransform)
FAISS_DECLARE_GETTER(IndexPreTransform, FaissIndex*, index)
FAISS_DECLARE_GETTER_SETTER(IndexPreTransform, int, own_fields)
int faiss_IndexPreTransform_new(FaissIndexPreTransform** p_index);
int faiss_IndexPreTransform_new_with(
FaissIndexPreTransform** p_index,
FaissIndex* index);
int faiss_IndexPreTransform_new_with_transform(
FaissIndexPreTransform** p_index,
FaissVectorTransform* ltrans,
FaissIndex* index);
#ifdef __cplusplus
}
+1 -1
View File
@@ -61,7 +61,7 @@ FAISS_DECLARE_GETTER_SETTER(Index, int, verbose)
*
* @param index opaque pointer to index object
* @param n nb of training vectors
* @param x training vecors, size n * d
* @param x training vectors, size n * d
*/
int faiss_Index_train(FaissIndex* index, idx_t n, const float* x);
+228
View File
@@ -0,0 +1,228 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
// Copyright 2004-present Facebook. All Rights Reserved.
// -*- c++ -*-
#include "VectorTransform_c.h"
#include <faiss/VectorTransform.h>
#include "macros_impl.h"
extern "C" {
DEFINE_DESTRUCTOR(VectorTransform)
DEFINE_GETTER(VectorTransform, int, is_trained)
DEFINE_GETTER(VectorTransform, int, d_in)
DEFINE_GETTER(VectorTransform, int, d_out)
int faiss_VectorTransform_train(
FaissVectorTransform* vt,
idx_t n,
const float* x) {
try {
reinterpret_cast<faiss::VectorTransform*>(vt)->train(n, x);
}
CATCH_AND_HANDLE
}
float* faiss_VectorTransform_apply(
const FaissVectorTransform* vt,
idx_t n,
const float* x) {
return reinterpret_cast<const faiss::VectorTransform*>(vt)->apply(n, x);
}
void faiss_VectorTransform_apply_noalloc(
const FaissVectorTransform* vt,
idx_t n,
const float* x,
float* xt) {
return reinterpret_cast<const faiss::VectorTransform*>(vt)->apply_noalloc(
n, x, xt);
}
void faiss_VectorTransform_reverse_transform(
const FaissVectorTransform* vt,
idx_t n,
const float* xt,
float* x) {
return reinterpret_cast<const faiss::VectorTransform*>(vt)
->reverse_transform(n, xt, x);
}
/*********************************************
* LinearTransform
*********************************************/
DEFINE_DESTRUCTOR(LinearTransform)
DEFINE_GETTER(LinearTransform, int, have_bias)
DEFINE_GETTER(LinearTransform, int, is_orthonormal)
void faiss_LinearTransform_transform_transpose(
const FaissLinearTransform* vt,
idx_t n,
const float* y,
float* x) {
return reinterpret_cast<const faiss::LinearTransform*>(vt)
->transform_transpose(n, y, x);
}
void faiss_LinearTransform_set_is_orthonormal(FaissLinearTransform* vt) {
return reinterpret_cast<faiss::LinearTransform*>(vt)->set_is_orthonormal();
}
/*********************************************
* RandomRotationMatrix
*********************************************/
DEFINE_DESTRUCTOR(RandomRotationMatrix)
int faiss_RandomRotationMatrix_new_with(
FaissRandomRotationMatrix** p_vt,
int d_in,
int d_out) {
try {
*p_vt = reinterpret_cast<FaissRandomRotationMatrix*>(
new faiss::RandomRotationMatrix(d_in, d_out));
}
CATCH_AND_HANDLE
}
/*********************************************
* PCAMatrix
*********************************************/
DEFINE_DESTRUCTOR(PCAMatrix)
int faiss_PCAMatrix_new_with(
FaissPCAMatrix** p_vt,
int d_in,
int d_out,
float eigen_power,
int random_rotation) {
try {
bool random_rotation_ = static_cast<bool>(random_rotation);
*p_vt = reinterpret_cast<FaissPCAMatrix*>(new faiss::PCAMatrix(
d_in, d_out, eigen_power, random_rotation_));
}
CATCH_AND_HANDLE
}
DEFINE_GETTER(PCAMatrix, float, eigen_power)
DEFINE_GETTER(PCAMatrix, int, random_rotation)
/*********************************************
* ITQMatrix
*********************************************/
DEFINE_DESTRUCTOR(ITQMatrix)
int faiss_ITQMatrix_new_with(FaissITQMatrix** p_vt, int d) {
try {
*p_vt = reinterpret_cast<FaissITQMatrix*>(new faiss::ITQMatrix(d));
}
CATCH_AND_HANDLE
}
DEFINE_DESTRUCTOR(ITQTransform)
int faiss_ITQTransform_new_with(
FaissITQTransform** p_vt,
int d_in,
int d_out,
int do_pca) {
try {
bool do_pca_ = static_cast<bool>(do_pca);
*p_vt = reinterpret_cast<FaissITQTransform*>(
new faiss::ITQTransform(d_in, d_out, do_pca_));
}
CATCH_AND_HANDLE
}
DEFINE_GETTER(ITQTransform, int, do_pca)
/*********************************************
* OPQMatrix
*********************************************/
DEFINE_DESTRUCTOR(OPQMatrix)
int faiss_OPQMatrix_new_with(FaissOPQMatrix** p_vt, int d, int M, int d2) {
try {
*p_vt = reinterpret_cast<FaissOPQMatrix*>(
new faiss::OPQMatrix(d, M, d2));
}
CATCH_AND_HANDLE
}
DEFINE_GETTER(OPQMatrix, int, verbose)
DEFINE_SETTER(OPQMatrix, int, verbose)
DEFINE_GETTER(OPQMatrix, int, niter)
DEFINE_SETTER(OPQMatrix, int, niter)
DEFINE_GETTER(OPQMatrix, int, niter_pq)
DEFINE_SETTER(OPQMatrix, int, niter_pq)
/*********************************************
* RemapDimensionsTransform
*********************************************/
DEFINE_DESTRUCTOR(RemapDimensionsTransform)
int faiss_RemapDimensionsTransform_new_with(
FaissRemapDimensionsTransform** p_vt,
int d_in,
int d_out,
int uniform) {
try {
bool uniform_ = static_cast<bool>(uniform);
*p_vt = reinterpret_cast<FaissRemapDimensionsTransform*>(
new faiss::RemapDimensionsTransform(d_in, d_out, uniform_));
}
CATCH_AND_HANDLE
}
/*********************************************
* NormalizationTransform
*********************************************/
DEFINE_DESTRUCTOR(NormalizationTransform)
int faiss_NormalizationTransform_new_with(
FaissNormalizationTransform** p_vt,
int d,
float norm) {
try {
*p_vt = reinterpret_cast<FaissNormalizationTransform*>(
new faiss::NormalizationTransform(d, norm));
}
CATCH_AND_HANDLE
}
DEFINE_GETTER(NormalizationTransform, float, norm)
/*********************************************
* CenteringTransform
*********************************************/
DEFINE_DESTRUCTOR(CenteringTransform)
int faiss_CenteringTransform_new_with(FaissCenteringTransform** p_vt, int d) {
try {
*p_vt = reinterpret_cast<FaissCenteringTransform*>(
new faiss::CenteringTransform(d));
}
CATCH_AND_HANDLE
}
}
+174
View File
@@ -0,0 +1,174 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
// Copyright 2004-present Facebook. All Rights Reserved.
// -*- c -*-
#ifndef FAISS_VECTOR_TRANSFORM_C_H
#define FAISS_VECTOR_TRANSFORM_C_H
/** Defines a few objects that apply transformations to a set of
* vectors Often these are pre-processing steps.
*/
#include "faiss_c.h"
#ifdef __cplusplus
extern "C" {
#endif
/// Opaque type for referencing to a VectorTransform object
FAISS_DECLARE_CLASS(VectorTransform)
FAISS_DECLARE_DESTRUCTOR(VectorTransform)
/// Getter for is_trained
FAISS_DECLARE_GETTER(VectorTransform, int, is_trained)
/// Getter for input dimension
FAISS_DECLARE_GETTER(VectorTransform, int, d_in)
/// Getter for output dimension
FAISS_DECLARE_GETTER(VectorTransform, int, d_out)
/** Perform training on a representative set of vectors
*
* @param vt opaque pointer to VectorTransform object
* @param n nb of training vectors
* @param x training vectors, size n * d
*/
int faiss_VectorTransform_train(
FaissVectorTransform* vt,
idx_t n,
const float* x);
/** apply the random rotation, return new allocated matrix
* @param x size n * d_in
* @return size n * d_out
*/
float* faiss_VectorTransform_apply(
const FaissVectorTransform* vt,
idx_t n,
const float* x);
/** apply transformation and result is pre-allocated
* @param x size n * d_in
* @param xt size n * d_out
*/
void faiss_VectorTransform_apply_noalloc(
const FaissVectorTransform* vt,
idx_t n,
const float* x,
float* xt);
/// reverse transformation. May not be implemented or may return
/// approximate result
void faiss_VectorTransform_reverse_transform(
const FaissVectorTransform* vt,
idx_t n,
const float* xt,
float* x);
/// Opaque type for referencing to a LinearTransform object
FAISS_DECLARE_CLASS_INHERITED(LinearTransform, VectorTransform)
FAISS_DECLARE_DESTRUCTOR(LinearTransform)
/// compute x = A^T * (x - b)
/// is reverse transform if A has orthonormal lines
void faiss_LinearTransform_transform_transpose(
const FaissLinearTransform* vt,
idx_t n,
const float* y,
float* x);
/// compute A^T * A to set the is_orthonormal flag
void faiss_LinearTransform_set_is_orthonormal(FaissLinearTransform* vt);
/// Getter for have_bias
FAISS_DECLARE_GETTER(LinearTransform, int, have_bias)
/// Getter for is_orthonormal
FAISS_DECLARE_GETTER(LinearTransform, int, is_orthonormal)
FAISS_DECLARE_CLASS_INHERITED(RandomRotationMatrix, LinearTransform)
FAISS_DECLARE_DESTRUCTOR(RandomRotationMatrix)
int faiss_RandomRotationMatrix_new_with(
FaissRandomRotationMatrix** p_vt,
int d_in,
int d_out);
FAISS_DECLARE_CLASS_INHERITED(PCAMatrix, LinearTransform)
FAISS_DECLARE_DESTRUCTOR(PCAMatrix)
int faiss_PCAMatrix_new_with(
FaissPCAMatrix** p_vt,
int d_in,
int d_out,
float eigen_power,
int random_rotation);
/// Getter for eigen_power
FAISS_DECLARE_GETTER(PCAMatrix, float, eigen_power)
/// Getter for random_rotation
FAISS_DECLARE_GETTER(PCAMatrix, int, random_rotation)
FAISS_DECLARE_CLASS_INHERITED(ITQMatrix, LinearTransform)
FAISS_DECLARE_DESTRUCTOR(ITQMatrix)
int faiss_ITQMatrix_new_with(FaissITQMatrix** p_vt, int d);
FAISS_DECLARE_CLASS_INHERITED(ITQTransform, VectorTransform)
FAISS_DECLARE_DESTRUCTOR(ITQTransform)
int faiss_ITQTransform_new_with(
FaissITQTransform** p_vt,
int d_in,
int d_out,
int do_pca);
/// Getter for do_pca
FAISS_DECLARE_GETTER(ITQTransform, int, do_pca)
FAISS_DECLARE_CLASS_INHERITED(OPQMatrix, LinearTransform)
FAISS_DECLARE_DESTRUCTOR(OPQMatrix)
int faiss_OPQMatrix_new_with(FaissOPQMatrix** p_vt, int d, int M, int d2);
FAISS_DECLARE_GETTER_SETTER(OPQMatrix, int, verbose)
FAISS_DECLARE_GETTER_SETTER(OPQMatrix, int, niter)
FAISS_DECLARE_GETTER_SETTER(OPQMatrix, int, niter_pq)
FAISS_DECLARE_CLASS_INHERITED(RemapDimensionsTransform, VectorTransform)
FAISS_DECLARE_DESTRUCTOR(RemapDimensionsTransform)
int faiss_RemapDimensionsTransform_new_with(
FaissRemapDimensionsTransform** p_vt,
int d_in,
int d_out,
int uniform);
FAISS_DECLARE_CLASS_INHERITED(NormalizationTransform, VectorTransform)
FAISS_DECLARE_DESTRUCTOR(NormalizationTransform)
int faiss_NormalizationTransform_new_with(
FaissNormalizationTransform** p_vt,
int d,
float norm);
FAISS_DECLARE_GETTER(NormalizationTransform, float, norm)
FAISS_DECLARE_CLASS_INHERITED(CenteringTransform, VectorTransform)
FAISS_DECLARE_DESTRUCTOR(CenteringTransform)
int faiss_CenteringTransform_new_with(FaissCenteringTransform** p_vt, int d);
#ifdef __cplusplus
}
#endif
#endif
+1 -1
View File
@@ -27,7 +27,7 @@ struct AutoTuneCriterion {
typedef Index::idx_t idx_t;
idx_t nq; ///< nb of queries this criterion is evaluated on
idx_t nnn; ///< nb of NNs that the query should request
idx_t gt_nnn; ///< nb of GT NNs required to evaluate crterion
idx_t gt_nnn; ///< nb of GT NNs required to evaluate criterion
std::vector<float> gt_D; ///< Ground-truth distances (size nq * gt_nnn)
std::vector<idx_t> gt_I; ///< Ground-truth indexes (size nq * gt_nnn)
+1 -1
View File
@@ -43,7 +43,7 @@ struct VectorTransform {
*/
virtual void train(idx_t n, const float* x);
/** apply the random roation, return new allocated matrix
/** apply the random rotation, return new allocated matrix
* @param x size n * d_in
* @return size n * d_out
*/