Changes in / [831:cc9e0c15d747:829:7762cab7f372] in lemon-main
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
lemon/capacity_scaling.h
r831 r825 320 320 "The cost type of CapacityScaling must be signed"); 321 321 322 // Reset data structures 322 // Resize vectors 323 _node_num = countNodes(_graph); 324 _arc_num = countArcs(_graph); 325 _res_arc_num = 2 * (_arc_num + _node_num); 326 _root = _node_num; 327 ++_node_num; 328 329 _first_out.resize(_node_num + 1); 330 _forward.resize(_res_arc_num); 331 _source.resize(_res_arc_num); 332 _target.resize(_res_arc_num); 333 _reverse.resize(_res_arc_num); 334 335 _lower.resize(_res_arc_num); 336 _upper.resize(_res_arc_num); 337 _cost.resize(_res_arc_num); 338 _supply.resize(_node_num); 339 340 _res_cap.resize(_res_arc_num); 341 _pi.resize(_node_num); 342 _excess.resize(_node_num); 343 _pred.resize(_node_num); 344 345 // Copy the graph 346 int i = 0, j = 0, k = 2 * _arc_num + _node_num - 1; 347 for (NodeIt n(_graph); n != INVALID; ++n, ++i) { 348 _node_id[n] = i; 349 } 350 i = 0; 351 for (NodeIt n(_graph); n != INVALID; ++n, ++i) { 352 _first_out[i] = j; 353 for (OutArcIt a(_graph, n); a != INVALID; ++a, ++j) { 354 _arc_idf[a] = j; 355 _forward[j] = true; 356 _source[j] = i; 357 _target[j] = _node_id[_graph.runningNode(a)]; 358 } 359 for (InArcIt a(_graph, n); a != INVALID; ++a, ++j) { 360 _arc_idb[a] = j; 361 _forward[j] = false; 362 _source[j] = i; 363 _target[j] = _node_id[_graph.runningNode(a)]; 364 } 365 _forward[j] = false; 366 _source[j] = i; 367 _target[j] = _root; 368 _reverse[j] = k; 369 _forward[k] = true; 370 _source[k] = _root; 371 _target[k] = i; 372 _reverse[k] = j; 373 ++j; ++k; 374 } 375 _first_out[i] = j; 376 _first_out[_node_num] = k; 377 for (ArcIt a(_graph); a != INVALID; ++a) { 378 int fi = _arc_idf[a]; 379 int bi = _arc_idb[a]; 380 _reverse[fi] = bi; 381 _reverse[bi] = fi; 382 } 383 384 // Reset parameters 323 385 reset(); 324 386 } … … 455 517 /// \endcode 456 518 /// 457 /// This function can be called more than once. All the givenparameters458 /// are kept for the next call, unless \ref resetParams() or \ref reset()459 /// is used, thus only the modified parameters have to be set again.460 /// If the underlying digraph was also modified after the construction461 /// of the class (or the last \ref reset() call), then the \ref reset()462 /// function must be called.519 /// This function can be called more than once. All the parameters 520 /// that have been given are kept for the next call, unless 521 /// \ref reset() is called, thus only the modified parameters 522 /// have to be set again. See \ref reset() for examples. 523 /// However, the underlying digraph must not be modified after this 524 /// class have been constructed, since it copies and extends the graph. 463 525 /// 464 526 /// \param factor The capacity scaling factor. It must be larger than … … 477 539 /// 478 540 /// \see ProblemType 479 /// \see resetParams(), reset()480 541 ProblemType run(int factor = 4) { 481 542 _factor = factor; … … 491 552 /// \ref costMap(), \ref supplyMap(), \ref stSupply(). 492 553 /// 493 /// It is useful for multiple \ref run() calls. Basically, all the given 494 /// parameters are kept for the next \ref run() call, unless 495 /// \ref resetParams() or \ref reset() is used. 496 /// If the underlying digraph was also modified after the construction 497 /// of the class or the last \ref reset() call, then the \ref reset() 498 /// function must be used, otherwise \ref resetParams() is sufficient. 554 /// It is useful for multiple run() calls. If this function is not 555 /// used, all the parameters given before are kept for the next 556 /// \ref run() call. 557 /// However, the underlying digraph must not be modified after this 558 /// class have been constructed, since it copies and extends the graph. 499 559 /// 500 560 /// For example, … … 506 566 /// .supplyMap(sup).run(); 507 567 /// 508 /// // Run again with modified cost map (reset Params() is not called,568 /// // Run again with modified cost map (reset() is not called, 509 569 /// // so only the cost map have to be set again) 510 570 /// cost[e] += 100; 511 571 /// cs.costMap(cost).run(); 512 572 /// 513 /// // Run again from scratch using reset Params()573 /// // Run again from scratch using reset() 514 574 /// // (the lower bounds will be set to zero on all arcs) 515 /// cs.reset Params();575 /// cs.reset(); 516 576 /// cs.upperMap(capacity).costMap(cost) 517 577 /// .supplyMap(sup).run(); … … 519 579 /// 520 580 /// \return <tt>(*this)</tt> 521 /// 522 /// \see reset(), run() 523 CapacityScaling& resetParams() { 581 CapacityScaling& reset() { 524 582 for (int i = 0; i != _node_num; ++i) { 525 583 _supply[i] = 0; … … 531 589 } 532 590 _have_lower = false; 533 return *this;534 }535 536 /// \brief Reset the internal data structures and all the parameters537 /// that have been given before.538 ///539 /// This function resets the internal data structures and all the540 /// paramaters that have been given before using functions \ref lowerMap(),541 /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply().542 ///543 /// It is useful for multiple \ref run() calls. Basically, all the given544 /// parameters are kept for the next \ref run() call, unless545 /// \ref resetParams() or \ref reset() is used.546 /// If the underlying digraph was also modified after the construction547 /// of the class or the last \ref reset() call, then the \ref reset()548 /// function must be used, otherwise \ref resetParams() is sufficient.549 ///550 /// See \ref resetParams() for examples.551 ///552 /// \return <tt>(*this)</tt>553 ///554 /// \see resetParams(), run()555 CapacityScaling& reset() {556 // Resize vectors557 _node_num = countNodes(_graph);558 _arc_num = countArcs(_graph);559 _res_arc_num = 2 * (_arc_num + _node_num);560 _root = _node_num;561 ++_node_num;562 563 _first_out.resize(_node_num + 1);564 _forward.resize(_res_arc_num);565 _source.resize(_res_arc_num);566 _target.resize(_res_arc_num);567 _reverse.resize(_res_arc_num);568 569 _lower.resize(_res_arc_num);570 _upper.resize(_res_arc_num);571 _cost.resize(_res_arc_num);572 _supply.resize(_node_num);573 574 _res_cap.resize(_res_arc_num);575 _pi.resize(_node_num);576 _excess.resize(_node_num);577 _pred.resize(_node_num);578 579 // Copy the graph580 int i = 0, j = 0, k = 2 * _arc_num + _node_num - 1;581 for (NodeIt n(_graph); n != INVALID; ++n, ++i) {582 _node_id[n] = i;583 }584 i = 0;585 for (NodeIt n(_graph); n != INVALID; ++n, ++i) {586 _first_out[i] = j;587 for (OutArcIt a(_graph, n); a != INVALID; ++a, ++j) {588 _arc_idf[a] = j;589 _forward[j] = true;590 _source[j] = i;591 _target[j] = _node_id[_graph.runningNode(a)];592 }593 for (InArcIt a(_graph, n); a != INVALID; ++a, ++j) {594 _arc_idb[a] = j;595 _forward[j] = false;596 _source[j] = i;597 _target[j] = _node_id[_graph.runningNode(a)];598 }599 _forward[j] = false;600 _source[j] = i;601 _target[j] = _root;602 _reverse[j] = k;603 _forward[k] = true;604 _source[k] = _root;605 _target[k] = i;606 _reverse[k] = j;607 ++j; ++k;608 }609 _first_out[i] = j;610 _first_out[_node_num] = k;611 for (ArcIt a(_graph); a != INVALID; ++a) {612 int fi = _arc_idf[a];613 int bi = _arc_idb[a];614 _reverse[fi] = bi;615 _reverse[bi] = fi;616 }617 618 // Reset parameters619 resetParams();620 591 return *this; 621 592 } -
lemon/cost_scaling.h
r831 r825 337 337 LEMON_ASSERT(std::numeric_limits<Cost>::is_signed, 338 338 "The cost type of CostScaling must be signed"); 339 340 // Reset data structures 341 reset(); 342 } 343 344 /// \name Parameters 345 /// The parameters of the algorithm can be specified using these 346 /// functions. 347 348 /// @{ 349 350 /// \brief Set the lower bounds on the arcs. 351 /// 352 /// This function sets the lower bounds on the arcs. 353 /// If it is not used before calling \ref run(), the lower bounds 354 /// will be set to zero on all arcs. 355 /// 356 /// \param map An arc map storing the lower bounds. 357 /// Its \c Value type must be convertible to the \c Value type 358 /// of the algorithm. 359 /// 360 /// \return <tt>(*this)</tt> 361 template <typename LowerMap> 362 CostScaling& lowerMap(const LowerMap& map) { 363 _have_lower = true; 364 for (ArcIt a(_graph); a != INVALID; ++a) { 365 _lower[_arc_idf[a]] = map[a]; 366 _lower[_arc_idb[a]] = map[a]; 367 } 368 return *this; 369 } 370 371 /// \brief Set the upper bounds (capacities) on the arcs. 372 /// 373 /// This function sets the upper bounds (capacities) on the arcs. 374 /// If it is not used before calling \ref run(), the upper bounds 375 /// will be set to \ref INF on all arcs (i.e. the flow value will be 376 /// unbounded from above). 377 /// 378 /// \param map An arc map storing the upper bounds. 379 /// Its \c Value type must be convertible to the \c Value type 380 /// of the algorithm. 381 /// 382 /// \return <tt>(*this)</tt> 383 template<typename UpperMap> 384 CostScaling& upperMap(const UpperMap& map) { 385 for (ArcIt a(_graph); a != INVALID; ++a) { 386 _upper[_arc_idf[a]] = map[a]; 387 } 388 return *this; 389 } 390 391 /// \brief Set the costs of the arcs. 392 /// 393 /// This function sets the costs of the arcs. 394 /// If it is not used before calling \ref run(), the costs 395 /// will be set to \c 1 on all arcs. 396 /// 397 /// \param map An arc map storing the costs. 398 /// Its \c Value type must be convertible to the \c Cost type 399 /// of the algorithm. 400 /// 401 /// \return <tt>(*this)</tt> 402 template<typename CostMap> 403 CostScaling& costMap(const CostMap& map) { 404 for (ArcIt a(_graph); a != INVALID; ++a) { 405 _scost[_arc_idf[a]] = map[a]; 406 _scost[_arc_idb[a]] = -map[a]; 407 } 408 return *this; 409 } 410 411 /// \brief Set the supply values of the nodes. 412 /// 413 /// This function sets the supply values of the nodes. 414 /// If neither this function nor \ref stSupply() is used before 415 /// calling \ref run(), the supply of each node will be set to zero. 416 /// 417 /// \param map A node map storing the supply values. 418 /// Its \c Value type must be convertible to the \c Value type 419 /// of the algorithm. 420 /// 421 /// \return <tt>(*this)</tt> 422 template<typename SupplyMap> 423 CostScaling& supplyMap(const SupplyMap& map) { 424 for (NodeIt n(_graph); n != INVALID; ++n) { 425 _supply[_node_id[n]] = map[n]; 426 } 427 return *this; 428 } 429 430 /// \brief Set single source and target nodes and a supply value. 431 /// 432 /// This function sets a single source node and a single target node 433 /// and the required flow value. 434 /// If neither this function nor \ref supplyMap() is used before 435 /// calling \ref run(), the supply of each node will be set to zero. 436 /// 437 /// Using this function has the same effect as using \ref supplyMap() 438 /// with such a map in which \c k is assigned to \c s, \c -k is 439 /// assigned to \c t and all other nodes have zero supply value. 440 /// 441 /// \param s The source node. 442 /// \param t The target node. 443 /// \param k The required amount of flow from node \c s to node \c t 444 /// (i.e. the supply of \c s and the demand of \c t). 445 /// 446 /// \return <tt>(*this)</tt> 447 CostScaling& stSupply(const Node& s, const Node& t, Value k) { 448 for (int i = 0; i != _res_node_num; ++i) { 449 _supply[i] = 0; 450 } 451 _supply[_node_id[s]] = k; 452 _supply[_node_id[t]] = -k; 453 return *this; 454 } 455 456 /// @} 457 458 /// \name Execution control 459 /// The algorithm can be executed using \ref run(). 460 461 /// @{ 462 463 /// \brief Run the algorithm. 464 /// 465 /// This function runs the algorithm. 466 /// The paramters can be specified using functions \ref lowerMap(), 467 /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply(). 468 /// For example, 469 /// \code 470 /// CostScaling<ListDigraph> cs(graph); 471 /// cs.lowerMap(lower).upperMap(upper).costMap(cost) 472 /// .supplyMap(sup).run(); 473 /// \endcode 474 /// 475 /// This function can be called more than once. All the given parameters 476 /// are kept for the next call, unless \ref resetParams() or \ref reset() 477 /// is used, thus only the modified parameters have to be set again. 478 /// If the underlying digraph was also modified after the construction 479 /// of the class (or the last \ref reset() call), then the \ref reset() 480 /// function must be called. 481 /// 482 /// \param method The internal method that will be used in the 483 /// algorithm. For more information, see \ref Method. 484 /// \param factor The cost scaling factor. It must be larger than one. 485 /// 486 /// \return \c INFEASIBLE if no feasible flow exists, 487 /// \n \c OPTIMAL if the problem has optimal solution 488 /// (i.e. it is feasible and bounded), and the algorithm has found 489 /// optimal flow and node potentials (primal and dual solutions), 490 /// \n \c UNBOUNDED if the digraph contains an arc of negative cost 491 /// and infinite upper bound. It means that the objective function 492 /// is unbounded on that arc, however, note that it could actually be 493 /// bounded over the feasible flows, but this algroithm cannot handle 494 /// these cases. 495 /// 496 /// \see ProblemType, Method 497 /// \see resetParams(), reset() 498 ProblemType run(Method method = PARTIAL_AUGMENT, int factor = 8) { 499 _alpha = factor; 500 ProblemType pt = init(); 501 if (pt != OPTIMAL) return pt; 502 start(method); 503 return OPTIMAL; 504 } 505 506 /// \brief Reset all the parameters that have been given before. 507 /// 508 /// This function resets all the paramaters that have been given 509 /// before using functions \ref lowerMap(), \ref upperMap(), 510 /// \ref costMap(), \ref supplyMap(), \ref stSupply(). 511 /// 512 /// It is useful for multiple \ref run() calls. Basically, all the given 513 /// parameters are kept for the next \ref run() call, unless 514 /// \ref resetParams() or \ref reset() is used. 515 /// If the underlying digraph was also modified after the construction 516 /// of the class or the last \ref reset() call, then the \ref reset() 517 /// function must be used, otherwise \ref resetParams() is sufficient. 518 /// 519 /// For example, 520 /// \code 521 /// CostScaling<ListDigraph> cs(graph); 522 /// 523 /// // First run 524 /// cs.lowerMap(lower).upperMap(upper).costMap(cost) 525 /// .supplyMap(sup).run(); 526 /// 527 /// // Run again with modified cost map (resetParams() is not called, 528 /// // so only the cost map have to be set again) 529 /// cost[e] += 100; 530 /// cs.costMap(cost).run(); 531 /// 532 /// // Run again from scratch using resetParams() 533 /// // (the lower bounds will be set to zero on all arcs) 534 /// cs.resetParams(); 535 /// cs.upperMap(capacity).costMap(cost) 536 /// .supplyMap(sup).run(); 537 /// \endcode 538 /// 539 /// \return <tt>(*this)</tt> 540 /// 541 /// \see reset(), run() 542 CostScaling& resetParams() { 543 for (int i = 0; i != _res_node_num; ++i) { 544 _supply[i] = 0; 545 } 546 int limit = _first_out[_root]; 547 for (int j = 0; j != limit; ++j) { 548 _lower[j] = 0; 549 _upper[j] = INF; 550 _scost[j] = _forward[j] ? 1 : -1; 551 } 552 for (int j = limit; j != _res_arc_num; ++j) { 553 _lower[j] = 0; 554 _upper[j] = INF; 555 _scost[j] = 0; 556 _scost[_reverse[j]] = 0; 557 } 558 _have_lower = false; 559 return *this; 560 } 561 562 /// \brief Reset all the parameters that have been given before. 563 /// 564 /// This function resets all the paramaters that have been given 565 /// before using functions \ref lowerMap(), \ref upperMap(), 566 /// \ref costMap(), \ref supplyMap(), \ref stSupply(). 567 /// 568 /// It is useful for multiple run() calls. If this function is not 569 /// used, all the parameters given before are kept for the next 570 /// \ref run() call. 571 /// However, the underlying digraph must not be modified after this 572 /// class have been constructed, since it copies and extends the graph. 573 /// \return <tt>(*this)</tt> 574 CostScaling& reset() { 339 575 340 // Resize vectors 576 341 _node_num = countNodes(_graph); … … 640 405 641 406 // Reset parameters 642 resetParams(); 407 reset(); 408 } 409 410 /// \name Parameters 411 /// The parameters of the algorithm can be specified using these 412 /// functions. 413 414 /// @{ 415 416 /// \brief Set the lower bounds on the arcs. 417 /// 418 /// This function sets the lower bounds on the arcs. 419 /// If it is not used before calling \ref run(), the lower bounds 420 /// will be set to zero on all arcs. 421 /// 422 /// \param map An arc map storing the lower bounds. 423 /// Its \c Value type must be convertible to the \c Value type 424 /// of the algorithm. 425 /// 426 /// \return <tt>(*this)</tt> 427 template <typename LowerMap> 428 CostScaling& lowerMap(const LowerMap& map) { 429 _have_lower = true; 430 for (ArcIt a(_graph); a != INVALID; ++a) { 431 _lower[_arc_idf[a]] = map[a]; 432 _lower[_arc_idb[a]] = map[a]; 433 } 434 return *this; 435 } 436 437 /// \brief Set the upper bounds (capacities) on the arcs. 438 /// 439 /// This function sets the upper bounds (capacities) on the arcs. 440 /// If it is not used before calling \ref run(), the upper bounds 441 /// will be set to \ref INF on all arcs (i.e. the flow value will be 442 /// unbounded from above). 443 /// 444 /// \param map An arc map storing the upper bounds. 445 /// Its \c Value type must be convertible to the \c Value type 446 /// of the algorithm. 447 /// 448 /// \return <tt>(*this)</tt> 449 template<typename UpperMap> 450 CostScaling& upperMap(const UpperMap& map) { 451 for (ArcIt a(_graph); a != INVALID; ++a) { 452 _upper[_arc_idf[a]] = map[a]; 453 } 454 return *this; 455 } 456 457 /// \brief Set the costs of the arcs. 458 /// 459 /// This function sets the costs of the arcs. 460 /// If it is not used before calling \ref run(), the costs 461 /// will be set to \c 1 on all arcs. 462 /// 463 /// \param map An arc map storing the costs. 464 /// Its \c Value type must be convertible to the \c Cost type 465 /// of the algorithm. 466 /// 467 /// \return <tt>(*this)</tt> 468 template<typename CostMap> 469 CostScaling& costMap(const CostMap& map) { 470 for (ArcIt a(_graph); a != INVALID; ++a) { 471 _scost[_arc_idf[a]] = map[a]; 472 _scost[_arc_idb[a]] = -map[a]; 473 } 474 return *this; 475 } 476 477 /// \brief Set the supply values of the nodes. 478 /// 479 /// This function sets the supply values of the nodes. 480 /// If neither this function nor \ref stSupply() is used before 481 /// calling \ref run(), the supply of each node will be set to zero. 482 /// 483 /// \param map A node map storing the supply values. 484 /// Its \c Value type must be convertible to the \c Value type 485 /// of the algorithm. 486 /// 487 /// \return <tt>(*this)</tt> 488 template<typename SupplyMap> 489 CostScaling& supplyMap(const SupplyMap& map) { 490 for (NodeIt n(_graph); n != INVALID; ++n) { 491 _supply[_node_id[n]] = map[n]; 492 } 493 return *this; 494 } 495 496 /// \brief Set single source and target nodes and a supply value. 497 /// 498 /// This function sets a single source node and a single target node 499 /// and the required flow value. 500 /// If neither this function nor \ref supplyMap() is used before 501 /// calling \ref run(), the supply of each node will be set to zero. 502 /// 503 /// Using this function has the same effect as using \ref supplyMap() 504 /// with such a map in which \c k is assigned to \c s, \c -k is 505 /// assigned to \c t and all other nodes have zero supply value. 506 /// 507 /// \param s The source node. 508 /// \param t The target node. 509 /// \param k The required amount of flow from node \c s to node \c t 510 /// (i.e. the supply of \c s and the demand of \c t). 511 /// 512 /// \return <tt>(*this)</tt> 513 CostScaling& stSupply(const Node& s, const Node& t, Value k) { 514 for (int i = 0; i != _res_node_num; ++i) { 515 _supply[i] = 0; 516 } 517 _supply[_node_id[s]] = k; 518 _supply[_node_id[t]] = -k; 519 return *this; 520 } 521 522 /// @} 523 524 /// \name Execution control 525 /// The algorithm can be executed using \ref run(). 526 527 /// @{ 528 529 /// \brief Run the algorithm. 530 /// 531 /// This function runs the algorithm. 532 /// The paramters can be specified using functions \ref lowerMap(), 533 /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply(). 534 /// For example, 535 /// \code 536 /// CostScaling<ListDigraph> cs(graph); 537 /// cs.lowerMap(lower).upperMap(upper).costMap(cost) 538 /// .supplyMap(sup).run(); 539 /// \endcode 540 /// 541 /// This function can be called more than once. All the parameters 542 /// that have been given are kept for the next call, unless 543 /// \ref reset() is called, thus only the modified parameters 544 /// have to be set again. See \ref reset() for examples. 545 /// However, the underlying digraph must not be modified after this 546 /// class have been constructed, since it copies and extends the graph. 547 /// 548 /// \param method The internal method that will be used in the 549 /// algorithm. For more information, see \ref Method. 550 /// \param factor The cost scaling factor. It must be larger than one. 551 /// 552 /// \return \c INFEASIBLE if no feasible flow exists, 553 /// \n \c OPTIMAL if the problem has optimal solution 554 /// (i.e. it is feasible and bounded), and the algorithm has found 555 /// optimal flow and node potentials (primal and dual solutions), 556 /// \n \c UNBOUNDED if the digraph contains an arc of negative cost 557 /// and infinite upper bound. It means that the objective function 558 /// is unbounded on that arc, however, note that it could actually be 559 /// bounded over the feasible flows, but this algroithm cannot handle 560 /// these cases. 561 /// 562 /// \see ProblemType, Method 563 ProblemType run(Method method = PARTIAL_AUGMENT, int factor = 8) { 564 _alpha = factor; 565 ProblemType pt = init(); 566 if (pt != OPTIMAL) return pt; 567 start(method); 568 return OPTIMAL; 569 } 570 571 /// \brief Reset all the parameters that have been given before. 572 /// 573 /// This function resets all the paramaters that have been given 574 /// before using functions \ref lowerMap(), \ref upperMap(), 575 /// \ref costMap(), \ref supplyMap(), \ref stSupply(). 576 /// 577 /// It is useful for multiple run() calls. If this function is not 578 /// used, all the parameters given before are kept for the next 579 /// \ref run() call. 580 /// However, the underlying digraph must not be modified after this 581 /// class have been constructed, since it copies and extends the graph. 582 /// 583 /// For example, 584 /// \code 585 /// CostScaling<ListDigraph> cs(graph); 586 /// 587 /// // First run 588 /// cs.lowerMap(lower).upperMap(upper).costMap(cost) 589 /// .supplyMap(sup).run(); 590 /// 591 /// // Run again with modified cost map (reset() is not called, 592 /// // so only the cost map have to be set again) 593 /// cost[e] += 100; 594 /// cs.costMap(cost).run(); 595 /// 596 /// // Run again from scratch using reset() 597 /// // (the lower bounds will be set to zero on all arcs) 598 /// cs.reset(); 599 /// cs.upperMap(capacity).costMap(cost) 600 /// .supplyMap(sup).run(); 601 /// \endcode 602 /// 603 /// \return <tt>(*this)</tt> 604 CostScaling& reset() { 605 for (int i = 0; i != _res_node_num; ++i) { 606 _supply[i] = 0; 607 } 608 int limit = _first_out[_root]; 609 for (int j = 0; j != limit; ++j) { 610 _lower[j] = 0; 611 _upper[j] = INF; 612 _scost[j] = _forward[j] ? 1 : -1; 613 } 614 for (int j = limit; j != _res_arc_num; ++j) { 615 _lower[j] = 0; 616 _upper[j] = INF; 617 _scost[j] = 0; 618 _scost[_reverse[j]] = 0; 619 } 620 _have_lower = false; 643 621 return *this; 644 622 } -
lemon/cycle_canceling.h
r830 r820 251 251 "The cost type of CycleCanceling must be signed"); 252 252 253 // Reset data structures 253 // Resize vectors 254 _node_num = countNodes(_graph); 255 _arc_num = countArcs(_graph); 256 _res_node_num = _node_num + 1; 257 _res_arc_num = 2 * (_arc_num + _node_num); 258 _root = _node_num; 259 260 _first_out.resize(_res_node_num + 1); 261 _forward.resize(_res_arc_num); 262 _source.resize(_res_arc_num); 263 _target.resize(_res_arc_num); 264 _reverse.resize(_res_arc_num); 265 266 _lower.resize(_res_arc_num); 267 _upper.resize(_res_arc_num); 268 _cost.resize(_res_arc_num); 269 _supply.resize(_res_node_num); 270 271 _res_cap.resize(_res_arc_num); 272 _pi.resize(_res_node_num); 273 274 _arc_vec.reserve(_res_arc_num); 275 _cost_vec.reserve(_res_arc_num); 276 _id_vec.reserve(_res_arc_num); 277 278 // Copy the graph 279 int i = 0, j = 0, k = 2 * _arc_num + _node_num; 280 for (NodeIt n(_graph); n != INVALID; ++n, ++i) { 281 _node_id[n] = i; 282 } 283 i = 0; 284 for (NodeIt n(_graph); n != INVALID; ++n, ++i) { 285 _first_out[i] = j; 286 for (OutArcIt a(_graph, n); a != INVALID; ++a, ++j) { 287 _arc_idf[a] = j; 288 _forward[j] = true; 289 _source[j] = i; 290 _target[j] = _node_id[_graph.runningNode(a)]; 291 } 292 for (InArcIt a(_graph, n); a != INVALID; ++a, ++j) { 293 _arc_idb[a] = j; 294 _forward[j] = false; 295 _source[j] = i; 296 _target[j] = _node_id[_graph.runningNode(a)]; 297 } 298 _forward[j] = false; 299 _source[j] = i; 300 _target[j] = _root; 301 _reverse[j] = k; 302 _forward[k] = true; 303 _source[k] = _root; 304 _target[k] = i; 305 _reverse[k] = j; 306 ++j; ++k; 307 } 308 _first_out[i] = j; 309 _first_out[_res_node_num] = k; 310 for (ArcIt a(_graph); a != INVALID; ++a) { 311 int fi = _arc_idf[a]; 312 int bi = _arc_idb[a]; 313 _reverse[fi] = bi; 314 _reverse[bi] = fi; 315 } 316 317 // Reset parameters 254 318 reset(); 255 319 } … … 386 450 /// \endcode 387 451 /// 388 /// This function can be called more than once. All the givenparameters389 /// are kept for the next call, unless \ref resetParams() or \ref reset()390 /// is used, thus only the modified parameters have to be set again.391 /// If the underlying digraph was also modified after the construction392 /// of the class (or the last \ref reset() call), then the \ref reset()393 /// function must be called.452 /// This function can be called more than once. All the parameters 453 /// that have been given are kept for the next call, unless 454 /// \ref reset() is called, thus only the modified parameters 455 /// have to be set again. See \ref reset() for examples. 456 /// However, the underlying digraph must not be modified after this 457 /// class have been constructed, since it copies and extends the graph. 394 458 /// 395 459 /// \param method The cycle-canceling method that will be used. … … 407 471 /// 408 472 /// \see ProblemType, Method 409 /// \see resetParams(), reset()410 473 ProblemType run(Method method = CANCEL_AND_TIGHTEN) { 411 474 ProblemType pt = init(); … … 421 484 /// \ref costMap(), \ref supplyMap(), \ref stSupply(). 422 485 /// 423 /// It is useful for multiple \ref run() calls. Basically, all the given 424 /// parameters are kept for the next \ref run() call, unless 425 /// \ref resetParams() or \ref reset() is used. 426 /// If the underlying digraph was also modified after the construction 427 /// of the class or the last \ref reset() call, then the \ref reset() 428 /// function must be used, otherwise \ref resetParams() is sufficient. 486 /// It is useful for multiple run() calls. If this function is not 487 /// used, all the parameters given before are kept for the next 488 /// \ref run() call. 489 /// However, the underlying digraph must not be modified after this 490 /// class have been constructed, since it copies and extends the graph. 429 491 /// 430 492 /// For example, … … 436 498 /// .supplyMap(sup).run(); 437 499 /// 438 /// // Run again with modified cost map (reset Params() is not called,500 /// // Run again with modified cost map (reset() is not called, 439 501 /// // so only the cost map have to be set again) 440 502 /// cost[e] += 100; 441 503 /// cc.costMap(cost).run(); 442 504 /// 443 /// // Run again from scratch using reset Params()505 /// // Run again from scratch using reset() 444 506 /// // (the lower bounds will be set to zero on all arcs) 445 /// cc.reset Params();507 /// cc.reset(); 446 508 /// cc.upperMap(capacity).costMap(cost) 447 509 /// .supplyMap(sup).run(); … … 449 511 /// 450 512 /// \return <tt>(*this)</tt> 451 /// 452 /// \see reset(), run() 453 CycleCanceling& resetParams() { 513 CycleCanceling& reset() { 454 514 for (int i = 0; i != _res_node_num; ++i) { 455 515 _supply[i] = 0; … … 468 528 } 469 529 _have_lower = false; 470 return *this;471 }472 473 /// \brief Reset the internal data structures and all the parameters474 /// that have been given before.475 ///476 /// This function resets the internal data structures and all the477 /// paramaters that have been given before using functions \ref lowerMap(),478 /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply().479 ///480 /// It is useful for multiple \ref run() calls. Basically, all the given481 /// parameters are kept for the next \ref run() call, unless482 /// \ref resetParams() or \ref reset() is used.483 /// If the underlying digraph was also modified after the construction484 /// of the class or the last \ref reset() call, then the \ref reset()485 /// function must be used, otherwise \ref resetParams() is sufficient.486 ///487 /// See \ref resetParams() for examples.488 ///489 /// \return <tt>(*this)</tt>490 ///491 /// \see resetParams(), run()492 CycleCanceling& reset() {493 // Resize vectors494 _node_num = countNodes(_graph);495 _arc_num = countArcs(_graph);496 _res_node_num = _node_num + 1;497 _res_arc_num = 2 * (_arc_num + _node_num);498 _root = _node_num;499 500 _first_out.resize(_res_node_num + 1);501 _forward.resize(_res_arc_num);502 _source.resize(_res_arc_num);503 _target.resize(_res_arc_num);504 _reverse.resize(_res_arc_num);505 506 _lower.resize(_res_arc_num);507 _upper.resize(_res_arc_num);508 _cost.resize(_res_arc_num);509 _supply.resize(_res_node_num);510 511 _res_cap.resize(_res_arc_num);512 _pi.resize(_res_node_num);513 514 _arc_vec.reserve(_res_arc_num);515 _cost_vec.reserve(_res_arc_num);516 _id_vec.reserve(_res_arc_num);517 518 // Copy the graph519 int i = 0, j = 0, k = 2 * _arc_num + _node_num;520 for (NodeIt n(_graph); n != INVALID; ++n, ++i) {521 _node_id[n] = i;522 }523 i = 0;524 for (NodeIt n(_graph); n != INVALID; ++n, ++i) {525 _first_out[i] = j;526 for (OutArcIt a(_graph, n); a != INVALID; ++a, ++j) {527 _arc_idf[a] = j;528 _forward[j] = true;529 _source[j] = i;530 _target[j] = _node_id[_graph.runningNode(a)];531 }532 for (InArcIt a(_graph, n); a != INVALID; ++a, ++j) {533 _arc_idb[a] = j;534 _forward[j] = false;535 _source[j] = i;536 _target[j] = _node_id[_graph.runningNode(a)];537 }538 _forward[j] = false;539 _source[j] = i;540 _target[j] = _root;541 _reverse[j] = k;542 _forward[k] = true;543 _source[k] = _root;544 _target[k] = i;545 _reverse[k] = j;546 ++j; ++k;547 }548 _first_out[i] = j;549 _first_out[_res_node_num] = k;550 for (ArcIt a(_graph); a != INVALID; ++a) {551 int fi = _arc_idf[a];552 int bi = _arc_idb[a];553 _reverse[fi] = bi;554 _reverse[bi] = fi;555 }556 557 // Reset parameters558 resetParams();559 530 return *this; 560 531 } -
lemon/network_simplex.h
r830 r812 195 195 IntVector _source; 196 196 IntVector _target; 197 bool _arc_mixing;198 197 199 198 // Node and arc data … … 635 634 NetworkSimplex(const GR& graph, bool arc_mixing = false) : 636 635 _graph(graph), _node_id(graph), _arc_id(graph), 637 _arc_mixing(arc_mixing),638 636 MAX(std::numeric_limits<Value>::max()), 639 637 INF(std::numeric_limits<Value>::has_infinity ? … … 646 644 "The cost type of NetworkSimplex must be signed"); 647 645 648 // Reset data structures 646 // Resize vectors 647 _node_num = countNodes(_graph); 648 _arc_num = countArcs(_graph); 649 int all_node_num = _node_num + 1; 650 int max_arc_num = _arc_num + 2 * _node_num; 651 652 _source.resize(max_arc_num); 653 _target.resize(max_arc_num); 654 655 _lower.resize(_arc_num); 656 _upper.resize(_arc_num); 657 _cap.resize(max_arc_num); 658 _cost.resize(max_arc_num); 659 _supply.resize(all_node_num); 660 _flow.resize(max_arc_num); 661 _pi.resize(all_node_num); 662 663 _parent.resize(all_node_num); 664 _pred.resize(all_node_num); 665 _forward.resize(all_node_num); 666 _thread.resize(all_node_num); 667 _rev_thread.resize(all_node_num); 668 _succ_num.resize(all_node_num); 669 _last_succ.resize(all_node_num); 670 _state.resize(max_arc_num); 671 672 // Copy the graph 673 int i = 0; 674 for (NodeIt n(_graph); n != INVALID; ++n, ++i) { 675 _node_id[n] = i; 676 } 677 if (arc_mixing) { 678 // Store the arcs in a mixed order 679 int k = std::max(int(std::sqrt(double(_arc_num))), 10); 680 int i = 0, j = 0; 681 for (ArcIt a(_graph); a != INVALID; ++a) { 682 _arc_id[a] = i; 683 _source[i] = _node_id[_graph.source(a)]; 684 _target[i] = _node_id[_graph.target(a)]; 685 if ((i += k) >= _arc_num) i = ++j; 686 } 687 } else { 688 // Store the arcs in the original order 689 int i = 0; 690 for (ArcIt a(_graph); a != INVALID; ++a, ++i) { 691 _arc_id[a] = i; 692 _source[i] = _node_id[_graph.source(a)]; 693 _target[i] = _node_id[_graph.target(a)]; 694 } 695 } 696 697 // Reset parameters 649 698 reset(); 650 699 } … … 794 843 /// \endcode 795 844 /// 796 /// This function can be called more than once. All the givenparameters797 /// are kept for the next call, unless \ref resetParams() or \ref reset()798 /// is used, thus only the modified parameters have to be set again.799 /// If the underlying digraph was also modified after the construction800 /// of the class (or the last \ref reset() call), then the \ref reset()801 /// function must be called.845 /// This function can be called more than once. All the parameters 846 /// that have been given are kept for the next call, unless 847 /// \ref reset() is called, thus only the modified parameters 848 /// have to be set again. See \ref reset() for examples. 849 /// However, the underlying digraph must not be modified after this 850 /// class have been constructed, since it copies and extends the graph. 802 851 /// 803 852 /// \param pivot_rule The pivot rule that will be used during the … … 813 862 /// 814 863 /// \see ProblemType, PivotRule 815 /// \see resetParams(), reset()816 864 ProblemType run(PivotRule pivot_rule = BLOCK_SEARCH) { 817 865 if (!init()) return INFEASIBLE; … … 825 873 /// \ref costMap(), \ref supplyMap(), \ref stSupply(), \ref supplyType(). 826 874 /// 827 /// It is useful for multiple \ref run() calls. Basically, all the given 828 /// parameters are kept for the next \ref run() call, unless 829 /// \ref resetParams() or \ref reset() is used. 830 /// If the underlying digraph was also modified after the construction 831 /// of the class or the last \ref reset() call, then the \ref reset() 832 /// function must be used, otherwise \ref resetParams() is sufficient. 875 /// It is useful for multiple run() calls. If this function is not 876 /// used, all the parameters given before are kept for the next 877 /// \ref run() call. 878 /// However, the underlying digraph must not be modified after this 879 /// class have been constructed, since it copies and extends the graph. 833 880 /// 834 881 /// For example, … … 840 887 /// .supplyMap(sup).run(); 841 888 /// 842 /// // Run again with modified cost map (reset Params() is not called,889 /// // Run again with modified cost map (reset() is not called, 843 890 /// // so only the cost map have to be set again) 844 891 /// cost[e] += 100; 845 892 /// ns.costMap(cost).run(); 846 893 /// 847 /// // Run again from scratch using reset Params()894 /// // Run again from scratch using reset() 848 895 /// // (the lower bounds will be set to zero on all arcs) 849 /// ns.reset Params();896 /// ns.reset(); 850 897 /// ns.upperMap(capacity).costMap(cost) 851 898 /// .supplyMap(sup).run(); … … 853 900 /// 854 901 /// \return <tt>(*this)</tt> 855 /// 856 /// \see reset(), run() 857 NetworkSimplex& resetParams() { 902 NetworkSimplex& reset() { 858 903 for (int i = 0; i != _node_num; ++i) { 859 904 _supply[i] = 0; … … 869 914 } 870 915 871 /// \brief Reset the internal data structures and all the parameters872 /// that have been given before.873 ///874 /// This function resets the internal data structures and all the875 /// paramaters that have been given before using functions \ref lowerMap(),876 /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply(),877 /// \ref supplyType().878 ///879 /// It is useful for multiple \ref run() calls. Basically, all the given880 /// parameters are kept for the next \ref run() call, unless881 /// \ref resetParams() or \ref reset() is used.882 /// If the underlying digraph was also modified after the construction883 /// of the class or the last \ref reset() call, then the \ref reset()884 /// function must be used, otherwise \ref resetParams() is sufficient.885 ///886 /// See \ref resetParams() for examples.887 ///888 /// \return <tt>(*this)</tt>889 ///890 /// \see resetParams(), run()891 NetworkSimplex& reset() {892 // Resize vectors893 _node_num = countNodes(_graph);894 _arc_num = countArcs(_graph);895 int all_node_num = _node_num + 1;896 int max_arc_num = _arc_num + 2 * _node_num;897 898 _source.resize(max_arc_num);899 _target.resize(max_arc_num);900 901 _lower.resize(_arc_num);902 _upper.resize(_arc_num);903 _cap.resize(max_arc_num);904 _cost.resize(max_arc_num);905 _supply.resize(all_node_num);906 _flow.resize(max_arc_num);907 _pi.resize(all_node_num);908 909 _parent.resize(all_node_num);910 _pred.resize(all_node_num);911 _forward.resize(all_node_num);912 _thread.resize(all_node_num);913 _rev_thread.resize(all_node_num);914 _succ_num.resize(all_node_num);915 _last_succ.resize(all_node_num);916 _state.resize(max_arc_num);917 918 // Copy the graph919 int i = 0;920 for (NodeIt n(_graph); n != INVALID; ++n, ++i) {921 _node_id[n] = i;922 }923 if (_arc_mixing) {924 // Store the arcs in a mixed order925 int k = std::max(int(std::sqrt(double(_arc_num))), 10);926 int i = 0, j = 0;927 for (ArcIt a(_graph); a != INVALID; ++a) {928 _arc_id[a] = i;929 _source[i] = _node_id[_graph.source(a)];930 _target[i] = _node_id[_graph.target(a)];931 if ((i += k) >= _arc_num) i = ++j;932 }933 } else {934 // Store the arcs in the original order935 int i = 0;936 for (ArcIt a(_graph); a != INVALID; ++a, ++i) {937 _arc_id[a] = i;938 _source[i] = _node_id[_graph.source(a)];939 _target[i] = _node_id[_graph.target(a)];940 }941 }942 943 // Reset parameters944 resetParams();945 return *this;946 }947 948 916 /// @} 949 917 -
test/min_cost_flow_test.cc
r830 r819 158 158 const MCF& const_mcf = mcf; 159 159 160 b = mcf.reset() .resetParams()160 b = mcf.reset() 161 161 .lowerMap(me.lower) 162 162 .upperMap(me.upper) … … 347 347 checkMcf(mcf1, mcf1.run(param), gr, l2, u, c, s2, 348 348 mcf1.OPTIMAL, true, 8010, test_str + "-4"); 349 mcf1.reset Params().supplyMap(s1);349 mcf1.reset().supplyMap(s1); 350 350 checkMcf(mcf1, mcf1.run(param), gr, l1, cu, cc, s1, 351 351 mcf1.OPTIMAL, true, 74, test_str + "-5"); … … 364 364 365 365 // Tests for the GEQ form 366 mcf1.reset Params().upperMap(u).costMap(c).supplyMap(s5);366 mcf1.reset().upperMap(u).costMap(c).supplyMap(s5); 367 367 checkMcf(mcf1, mcf1.run(param), gr, l1, u, c, s5, 368 368 mcf1.OPTIMAL, true, 3530, test_str + "-10", GEQ); … … 381 381 checkMcf(mcf2, mcf2.run(param), neg1_gr, neg1_l1, neg1_u2, neg1_c, neg1_s, 382 382 mcf2.OPTIMAL, true, -40000, test_str + "-14"); 383 mcf2.reset Params().lowerMap(neg1_l2).costMap(neg1_c).supplyMap(neg1_s);383 mcf2.reset().lowerMap(neg1_l2).costMap(neg1_c).supplyMap(neg1_s); 384 384 checkMcf(mcf2, mcf2.run(param), neg1_gr, neg1_l2, neg1_u1, neg1_c, neg1_s, 385 385 mcf2.UNBOUNDED, false, 0, test_str + "-15");
Note: See TracChangeset
for help on using the changeset viewer.