Commit 2f727ef1 authored by Sergei Golubchik's avatar Sergei Golubchik

mhnsw: cache start node too, don't push too much in pg_discard

parent b2d1e9b7
...@@ -233,10 +233,10 @@ static int select_neighbors(MHNSW_Context *ctx, size_t layer, ...@@ -233,10 +233,10 @@ static int select_neighbors(MHNSW_Context *ctx, size_t layer,
if ((discard= vec->distance_to(neigh) < target_dist)) if ((discard= vec->distance_to(neigh) < target_dist))
break; break;
} }
if (discard) if (!discard)
pq_discard.push(vec);
else
neighbors.push_back(vec, &ctx->root); neighbors.push_back(vec, &ctx->root);
else if (pq_discard.elements() + neighbors.elements < max_neighbor_connections)
pq_discard.push(vec);
} }
while (pq_discard.elements() && while (pq_discard.elements() &&
...@@ -454,12 +454,12 @@ int mhnsw_insert(TABLE *table, KEY *keyinfo) ...@@ -454,12 +454,12 @@ int mhnsw_insert(TABLE *table, KEY *keyinfo)
String ref_str, *ref_ptr; String ref_str, *ref_ptr;
ref_ptr= graph->field[1]->val_str(&ref_str); ref_ptr= graph->field[1]->val_str(&ref_str);
FVectorNode start_node(&ctx, ref_ptr->ptr()); FVectorNode *start_node= ctx.get_node(ref_ptr->ptr());
if (start_nodes.push_back(&start_node, &ctx.root)) if (start_nodes.push_back(start_node, &ctx.root))
return HA_ERR_OUT_OF_MEM; return HA_ERR_OUT_OF_MEM;
if (int err= start_node.instantiate_vector()) if (int err= start_node->instantiate_vector())
return err; return err;
if (ctx.vec_len * sizeof(float) != res->length()) if (ctx.vec_len * sizeof(float) != res->length())
...@@ -543,14 +543,14 @@ int mhnsw_first(TABLE *table, KEY *keyinfo, Item *dist, ulonglong limit) ...@@ -543,14 +543,14 @@ int mhnsw_first(TABLE *table, KEY *keyinfo, Item *dist, ulonglong limit)
List<FVectorNode> start_nodes; List<FVectorNode> start_nodes;
String ref_str, *ref_ptr= graph->field[1]->val_str(&ref_str); String ref_str, *ref_ptr= graph->field[1]->val_str(&ref_str);
FVectorNode start_node(&ctx, ref_ptr->ptr()); FVectorNode *start_node= ctx.get_node(ref_ptr->ptr());
// one could put all max_layer nodes in start_nodes // one could put all max_layer nodes in start_nodes
// but it has no effect of the recall or speed // but it has no effect of the recall or speed
if (start_nodes.push_back(&start_node, &ctx.root)) if (start_nodes.push_back(start_node, &ctx.root))
return HA_ERR_OUT_OF_MEM; return HA_ERR_OUT_OF_MEM;
if (int err= start_node.instantiate_vector()) if (int err= start_node->instantiate_vector())
return err; return err;
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment