@@ -204,7 +204,26 @@ static PyObject* minimum_spanning_tree_prim_adjacency_list(PyObject* self, PyObj
204
204
for (const auto & [adj_name, _] : start_node->adjacent ) {
205
205
std::string key = make_edge_key (start, adj_name);
206
206
GraphEdge* edge = graph->edges [key];
207
- pq.push ({start, adj_name, edge->value , edge->value_type });
207
+ EdgeTuple et;
208
+ et.source = start;
209
+ et.target = adj_name;
210
+ et.value_type = edge->value_type ;
211
+
212
+ switch (edge->value_type ) {
213
+ case DataType::Int:
214
+ et.value = std::get<int64_t >(edge->value );
215
+ break ;
216
+ case DataType::Double:
217
+ et.value = std::get<double >(edge->value );
218
+ break ;
219
+ case DataType::String:
220
+ et.value = std::get<std::string>(edge->value );
221
+ break ;
222
+ default :
223
+ et.value = std::monostate{};
224
+ }
225
+
226
+ pq.push (et);
208
227
}
209
228
210
229
while (!pq.empty ()) {
@@ -233,20 +252,24 @@ static PyObject* minimum_spanning_tree_prim_adjacency_list(PyObject* self, PyObj
233
252
234
253
std::string key_uv = make_edge_key (edge.source , edge.target );
235
254
GraphEdge* new_edge = PyObject_New (GraphEdge, &GraphEdgeType);
255
+ PyObject_Init (reinterpret_cast <PyObject*>(new_edge), &GraphEdgeType);
256
+ new (&new_edge->value ) std::variant<std::monostate, int64_t , double , std::string>(edge.value );
257
+ new_edge->value_type = edge.value_type ;
236
258
Py_INCREF (u);
237
259
Py_INCREF (v);
238
260
new_edge->source = reinterpret_cast <PyObject*>(u);
239
261
new_edge->target = reinterpret_cast <PyObject*>(v);
240
- new (&new_edge->value ) std::variant<std::monostate, int64_t , double , std::string>(edge.value );
241
- new_edge->value_type = edge.value_type ;
242
262
mst->edges [key_uv] = new_edge;
243
263
244
264
std::string key_vu = make_edge_key (edge.target , edge.source );
245
265
GraphEdge* new_edge_rev = PyObject_New (GraphEdge, &GraphEdgeType);
246
- new_edge_rev->source = reinterpret_cast <PyObject*>(v);
247
- new_edge_rev->target = reinterpret_cast <PyObject*>(u);
266
+ PyObject_Init (reinterpret_cast <PyObject*>(new_edge_rev), &GraphEdgeType);
248
267
new (&new_edge_rev->value ) std::variant<std::monostate, int64_t , double , std::string>(edge.value );
249
268
new_edge_rev->value_type = edge.value_type ;
269
+ Py_INCREF (u);
270
+ Py_INCREF (v);
271
+ new_edge_rev->source = reinterpret_cast <PyObject *>(v);
272
+ new_edge_rev->target = reinterpret_cast <PyObject*>(u);
250
273
mst->edges [key_vu] = new_edge_rev;
251
274
252
275
AdjacencyListGraphNode* next_node = graph->node_map [edge.target ];
@@ -255,10 +278,27 @@ static PyObject* minimum_spanning_tree_prim_adjacency_list(PyObject* self, PyObj
255
278
if (visited.count (adj_name)) continue ;
256
279
std::string key = make_edge_key (edge.target , adj_name);
257
280
GraphEdge* adj_edge = graph->edges [key];
258
- pq.push ({edge.target , adj_name, adj_edge->value , adj_edge->value_type });
281
+ EdgeTuple adj_et;
282
+ adj_et.source = edge.target ;
283
+ adj_et.target = adj_name;
284
+ adj_et.value_type = adj_edge->value_type ;
285
+
286
+ switch (adj_edge->value_type ) {
287
+ case DataType::Int:
288
+ adj_et.value = std::get<int64_t >(adj_edge->value );
289
+ break ;
290
+ case DataType::Double:
291
+ adj_et.value = std::get<double >(adj_edge->value );
292
+ break ;
293
+ case DataType::String:
294
+ adj_et.value = std::get<std::string>(adj_edge->value );
295
+ break ;
296
+ default :
297
+ adj_et.value = std::monostate{};
298
+ }
299
+
300
+ pq.push (adj_et);
259
301
}
260
302
}
261
-
262
- Py_INCREF (mst);
263
303
return reinterpret_cast <PyObject*>(mst);
264
304
}
0 commit comments