in java/com_spotify_voyager_jni_Index.cpp [793:856]
void Java_com_spotify_voyager_jni_Index_nativeLoadFromFileWithParameters(
JNIEnv *env, jobject self, jstring filename, jobject spaceType,
jint numDimensions, jobject storageDataType) {
try {
auto inputStream =
std::make_shared<FileInputStream>(toString(env, filename));
std::unique_ptr<voyager::Metadata::V1> metadata =
voyager::Metadata::loadFromStream(inputStream);
if (metadata) {
if (metadata->getStorageDataType() !=
toStorageDataType(env, storageDataType)) {
throw std::domain_error(
"Provided storage data type (" +
toString(toStorageDataType(env, storageDataType)) +
") does not match the data type used in this file (" +
toString(metadata->getStorageDataType()) + ").");
}
if (metadata->getSpaceType() != toSpaceType(env, spaceType)) {
throw std::domain_error(
"Provided space type (" + toString(toSpaceType(env, spaceType)) +
") does not match the space type used in this file (" +
toString(metadata->getSpaceType()) + ").");
}
if (metadata->getNumDimensions() != numDimensions) {
throw std::domain_error(
"Provided number of dimensions (" + std::to_string(numDimensions) +
") does not match the number of dimensions used in this file (" +
std::to_string(metadata->getNumDimensions()) + ").");
}
setHandle<Index>(
env, self,
loadTypedIndexFromMetadata(std::move(metadata), inputStream)
.release());
return;
}
switch (toStorageDataType(env, storageDataType)) {
case StorageDataType::Float32:
setHandle<Index>(env, self,
new TypedIndex<float>(inputStream,
toSpaceType(env, spaceType),
numDimensions));
break;
case StorageDataType::Float8:
setHandle<Index>(
env, self,
new TypedIndex<float, int8_t, std::ratio<1, 127>>(
inputStream, toSpaceType(env, spaceType), numDimensions));
break;
case StorageDataType::E4M3:
setHandle<Index>(env, self,
new TypedIndex<float, E4M3>(inputStream,
toSpaceType(env, spaceType),
numDimensions));
break;
}
} catch (std::exception const &e) {
if (!env->ExceptionCheck()) {
env->ThrowNew(env->FindClass("java/lang/RuntimeException"), e.what());
}
}
}