Skip to content

Commit

Permalink
Fix: Allow missing metric state
Browse files Browse the repository at this point in the history
  • Loading branch information
ashvardanian committed Mar 31, 2024
1 parent 349c02d commit 4b8e1a8
Show file tree
Hide file tree
Showing 7 changed files with 16 additions and 7 deletions.
2 changes: 1 addition & 1 deletion c/lib.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ USEARCH_EXPORT usearch_index_t usearch_init(usearch_init_options_t* options, use
reinterpret_cast<std::uintptr_t>(options->metric), //
metric_punned_signature_t::array_array_k, //
metric_kind, scalar_kind);
if (!metric) {
if (metric.missing()) {
*error = "Unknown metric kind!";
return NULL;
}
Expand Down
11 changes: 10 additions & 1 deletion include/usearch/index_plugins.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1401,7 +1401,16 @@ class metric_punned_t {
inline std::size_t dimensions() const noexcept { return dimensions_; }
inline metric_kind_t metric_kind() const noexcept { return metric_kind_; }
inline scalar_kind_t scalar_kind() const noexcept { return scalar_kind_; }
explicit inline operator bool() const noexcept { return metric_routed_ && metric_ptr_; }
inline explicit operator bool() const noexcept { return metric_routed_ && metric_ptr_; }

/**
* @brief Checks fi we've failed to initialized the metric with provided arguments.
*
* It's different from `operator bool()` when it comes to explicitly uninitialized metrics.
* It's a common case, where a NULL state is created only to be overwritten later, when
* we recover an old index state from a file or a network.
*/
inline bool missing() const noexcept { return !bool(*this) && metric_kind_ != metric_kind_t::unknown_k; }

inline char const* isa_name() const noexcept {
if (!*this)
Expand Down
2 changes: 1 addition & 1 deletion java/cloud/unum/usearch/cloud_unum_usearch_Index.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ JNIEXPORT jlong JNICALL Java_cloud_unum_usearch_Index_c_1create( //
index_dense_config_t config(static_cast<std::size_t>(connectivity), static_cast<std::size_t>(expansion_add),
static_cast<std::size_t>(expansion_search));
metric_punned_t metric(static_cast<std::size_t>(dimensions), metric_kind, quantization);
if (!metric) {
if (metric.missing()) {
jclass jc = (*env).FindClass("java/lang/Error");
if (jc)
(*env).ThrowNew(jc, "Failed to initialize the metric!");
Expand Down
2 changes: 1 addition & 1 deletion javascript/lib.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ CompiledIndex::CompiledIndex(Napi::CallbackInfo const& ctx) : Napi::ObjectWrap<C
bool multi = ctx[6].As<Napi::Boolean>().Value();

metric_punned_t metric(dimensions, metric_kind, quantization);
if (!metric) {
if (metric.missing()) {
Napi::TypeError::New(ctx.Env(), "Failed to initialize the metric!").ThrowAsJavaScriptException();
return;
}
Expand Down
2 changes: 1 addition & 1 deletion objc/USearchObjective.mm
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ + (instancetype)make:(USearchMetric)metricKind dimensions:(UInt32)dimensions con

index_config_t config(static_cast<std::size_t>(connectivity));
metric_punned_t metric(dims, to_native_metric(metricKind), to_native_scalar(quantization));
if (!metric) {
if (metric.missing()) {
@throw [NSException exceptionWithName:@"Can't create an index"
reason:@"The metric is not supported"
userInfo:nil];
Expand Down
2 changes: 1 addition & 1 deletion python/lib.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ static dense_index_py_t make_index( //
metric_uintptr //
? metric_t(dimensions, metric_uintptr, metric_signature, metric_kind, scalar_kind)
: metric_t(dimensions, metric_kind, scalar_kind);
if (!metric)
if (metric.missing())
throw std::invalid_argument("Unsupported metric!");

return index_dense_t::make(metric, config);
Expand Down
2 changes: 1 addition & 1 deletion rust/lib.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ std::unique_ptr<NativeIndex> new_native_index(IndexOptions const& options) {
metric_kind_t metric_kind = rust_to_cpp_metric(options.metric);
scalar_kind_t scalar_kind = rust_to_cpp_scalar(options.quantization);
metric_punned_t metric(options.dimensions, metric_kind, scalar_kind);
if (!metric)
if (metric.missing())
throw std::invalid_argument("Unsupported metric or scalar type");
index_dense_config_t config(options.connectivity, options.expansion_add, options.expansion_search);
config.multi = options.multi;
Expand Down

0 comments on commit 4b8e1a8

Please sign in to comment.