# HG changeset patch
# User Balazs Dezso <deba@inf.elte.hu>
# Date 1267712459 -3600
# Node ID 41d7ac528c3a59d8b7cad357b6cacaa493a1c89f
# Parent 86613aa28a0ce5afcae34ad41acd910079f97394
Uniforming primal scale to 2 (#314)
diff -r 86613aa28a0c -r 41d7ac528c3a lemon/fractional_matching.h
|
a
|
b
|
|
| 658 | 658 | /// After it the matching (the primal solution) and the dual solution |
| 659 | 659 | /// can be obtained using the query functions. |
| 660 | 660 | /// |
| 661 | | /// If the value type is integer, then the primal and the dual |
| 662 | | /// solutions are multiplied by |
| 663 | | /// \ref MaxWeightedFractionalMatching::primalScale "2" and |
| 664 | | /// \ref MaxWeightedFractionalMatching::dualScale "4" respectively. |
| | 661 | /// The primal solution is multiplied by |
| | 662 | /// \ref MaxWeightedFractionalMatching::primalScale "2". |
| | 663 | /// If the value type is integer, then the dual |
| | 664 | /// solution is scaled by |
| | 665 | /// \ref MaxWeightedFractionalMatching::dualScale "4". |
| 665 | 666 | /// |
| 666 | 667 | /// \tparam GR The undirected graph type the algorithm runs on. |
| 667 | 668 | /// \tparam WM The type edge weight map. The default type is |
| … |
… |
|
| 688 | 689 | |
| 689 | 690 | /// \brief Scaling factor for primal solution |
| 690 | 691 | /// |
| 691 | | /// Scaling factor for primal solution. It is equal to 2 or 1 |
| 692 | | /// according to the value type. |
| 693 | | static const int primalScale = |
| 694 | | std::numeric_limits<Value>::is_integer ? 2 : 1; |
| | 692 | /// Scaling factor for primal solution. |
| | 693 | static const int primalScale = 2; |
| 695 | 694 | |
| 696 | 695 | /// \brief Scaling factor for dual solution |
| 697 | 696 | /// |
| … |
… |
|
| 1329 | 1328 | /// "primal scale". |
| 1330 | 1329 | /// |
| 1331 | 1330 | /// \pre Either run() or start() must be called before using this function. |
| 1332 | | Value matching(const Edge& edge) const { |
| 1333 | | return Value(edge == (*_matching)[_graph.u(edge)] ? 1 : 0) |
| 1334 | | * primalScale / 2 + Value(edge == (*_matching)[_graph.v(edge)] ? 1 : 0) |
| 1335 | | * primalScale / 2; |
| | 1331 | int matching(const Edge& edge) const { |
| | 1332 | return (edge == (*_matching)[_graph.u(edge)] ? 1 : 0) |
| | 1333 | + (edge == (*_matching)[_graph.v(edge)] ? 1 : 0); |
| 1336 | 1334 | } |
| 1337 | 1335 | |
| 1338 | 1336 | /// \brief Return the fractional matching arc (or edge) incident |
| … |
… |
|
| 1423 | 1421 | /// The algorithm can be executed with the run() function. |
| 1424 | 1422 | /// After it the matching (the primal solution) and the dual solution |
| 1425 | 1423 | /// can be obtained using the query functions. |
| 1426 | | |
| 1427 | | /// If the value type is integer, then the primal and the dual |
| 1428 | | /// solutions are multiplied by |
| 1429 | | /// \ref MaxWeightedPerfectFractionalMatching::primalScale "2" and |
| 1430 | | /// \ref MaxWeightedPerfectFractionalMatching::dualScale "4" respectively. |
| | 1424 | /// |
| | 1425 | /// The primal solution is multiplied by |
| | 1426 | /// \ref MaxWeightedPerfectFractionalMatching::primalScale "2". |
| | 1427 | /// If the value type is integer, then the dual |
| | 1428 | /// solution is scaled by |
| | 1429 | /// \ref MaxWeightedPerfectFractionalMatching::dualScale "4". |
| 1431 | 1430 | /// |
| 1432 | 1431 | /// \tparam GR The undirected graph type the algorithm runs on. |
| 1433 | 1432 | /// \tparam WM The type edge weight map. The default type is |
| … |
… |
|
| 1454 | 1453 | |
| 1455 | 1454 | /// \brief Scaling factor for primal solution |
| 1456 | 1455 | /// |
| 1457 | | /// Scaling factor for primal solution. It is equal to 2 or 1 |
| 1458 | | /// according to the value type. |
| 1459 | | static const int primalScale = |
| 1460 | | std::numeric_limits<Value>::is_integer ? 2 : 1; |
| | 1456 | /// Scaling factor for primal solution. |
| | 1457 | static const int primalScale = 2; |
| 1461 | 1458 | |
| 1462 | 1459 | /// \brief Scaling factor for dual solution |
| 1463 | 1460 | /// |
| … |
… |
|
| 2064 | 2061 | /// "primal scale". |
| 2065 | 2062 | /// |
| 2066 | 2063 | /// \pre Either run() or start() must be called before using this function. |
| 2067 | | Value matching(const Edge& edge) const { |
| 2068 | | return Value(edge == (*_matching)[_graph.u(edge)] ? 1 : 0) |
| 2069 | | * primalScale / 2 + Value(edge == (*_matching)[_graph.v(edge)] ? 1 : 0) |
| 2070 | | * primalScale / 2; |
| | 2064 | int matching(const Edge& edge) const { |
| | 2065 | return (edge == (*_matching)[_graph.u(edge)] ? 1 : 0) |
| | 2066 | + (edge == (*_matching)[_graph.v(edge)] ? 1 : 0); |
| 2071 | 2067 | } |
| 2072 | 2068 | |
| 2073 | 2069 | /// \brief Return the fractional matching arc (or edge) incident |
diff -r 86613aa28a0c -r 41d7ac528c3a test/fractional_matching_test.cc
|
a
|
b
|
|
| 236 | 236 | } |
| 237 | 237 | check(pv == mfm.matchingSize(), "Wrong matching size"); |
| 238 | 238 | |
| | 239 | for (SmartGraph::EdgeIt e(graph); e != INVALID; ++e) { |
| | 240 | check((e == mfm.matching(graph.u(e)) ? 1 : 0) + |
| | 241 | (e == mfm.matching(graph.v(e)) ? 1 : 0) == |
| | 242 | mfm.matching(e), "Invalid matching"); |
| | 243 | } |
| | 244 | |
| 239 | 245 | SmartGraph::NodeMap<bool> processed(graph, false); |
| 240 | 246 | for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) { |
| 241 | 247 | if (processed[n]) continue; |
| … |
… |
|
| 284 | 290 | check(mfm.matching(n) != INVALID, "Invalid matching"); |
| 285 | 291 | check(indeg == 1, "Invalid matching"); |
| 286 | 292 | } |
| | 293 | for (SmartGraph::EdgeIt e(graph); e != INVALID; ++e) { |
| | 294 | check((e == mfm.matching(graph.u(e)) ? 1 : 0) + |
| | 295 | (e == mfm.matching(graph.v(e)) ? 1 : 0) == |
| | 296 | mfm.matching(e), "Invalid matching"); |
| | 297 | } |
| 287 | 298 | } else { |
| 288 | 299 | int anum = 0, bnum = 0; |
| 289 | 300 | SmartGraph::NodeMap<bool> neighbours(graph, false); |
| … |
… |
|
| 337 | 348 | } |
| 338 | 349 | } |
| 339 | 350 | |
| | 351 | for (SmartGraph::EdgeIt e(graph); e != INVALID; ++e) { |
| | 352 | check((e == mwfm.matching(graph.u(e)) ? 1 : 0) + |
| | 353 | (e == mwfm.matching(graph.v(e)) ? 1 : 0) == |
| | 354 | mwfm.matching(e), "Invalid matching"); |
| | 355 | } |
| | 356 | |
| 340 | 357 | int dv = 0; |
| 341 | 358 | for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) { |
| 342 | 359 | dv += mwfm.nodeValue(n); |
| … |
… |
|
| 391 | 408 | SmartGraph::Node o = graph.target(mwpfm.matching(n)); |
| 392 | 409 | } |
| 393 | 410 | |
| | 411 | for (SmartGraph::EdgeIt e(graph); e != INVALID; ++e) { |
| | 412 | check((e == mwpfm.matching(graph.u(e)) ? 1 : 0) + |
| | 413 | (e == mwpfm.matching(graph.v(e)) ? 1 : 0) == |
| | 414 | mwpfm.matching(e), "Invalid matching"); |
| | 415 | } |
| | 416 | |
| 394 | 417 | int dv = 0; |
| 395 | 418 | for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) { |
| 396 | 419 | dv += mwpfm.nodeValue(n); |