COIN-OR::LEMON - Graph Library

Changes in / [921:140c953ad5d1:922:9312d6c89d02] in lemon-main


Ignore:
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • doc/coding_style.dox

    r440 r919  
    9999\subsection pri-loc-var Private member variables
    100100
    101 Private member variables should start with underscore
     101Private member variables should start with underscore.
    102102
    103103\code
    104 _start_with_underscores
     104_start_with_underscore
    105105\endcode
    106106
  • doc/groups.dox

    r904 r919  
    407407   strongly polynomial \ref klein67primal, \ref goldberg89cyclecanceling.
    408408
    409 In general NetworkSimplex is the most efficient implementation,
    410 but in special cases other algorithms could be faster.
     409In general, \ref NetworkSimplex and \ref CostScaling are the most efficient
     410implementations, but the other two algorithms could be faster in special cases.
    411411For example, if the total supply and/or capacities are rather small,
    412 CapacityScaling is usually the fastest algorithm (without effective scaling).
     412\ref CapacityScaling is usually the fastest algorithm (without effective scaling).
    413413*/
    414414
     
    472472  \ref dasdan98minmeancycle.
    473473
    474 In practice, the \ref HowardMmc "Howard" algorithm proved to be by far the
     474In practice, the \ref HowardMmc "Howard" algorithm turned out to be by far the
    475475most efficient one, though the best known theoretical bound on its running
    476476time is exponential.
     
    540540
    541541/**
    542 @defgroup planar Planarity Embedding and Drawing
     542@defgroup planar Planar Embedding and Drawing
    543543@ingroup algs
    544544\brief Algorithms for planarity checking, embedding and drawing
  • lemon/capacity_scaling.h

    r921 r922  
    9090  /// \warning All input data (capacities, supply values, and costs) must
    9191  /// be integer.
    92   /// \warning This algorithm does not support negative costs for such
    93   /// arcs that have infinite upper bound.
     92  /// \warning This algorithm does not support negative costs for
     93  /// arcs having infinite upper bound.
    9494#ifdef DOXYGEN
    9595  template <typename GR, typename V, typename C, typename TR>
     
    424424    ///
    425425    /// Using this function has the same effect as using \ref supplyMap()
    426     /// with such a map in which \c k is assigned to \c s, \c -k is
     426    /// with a map in which \c k is assigned to \c s, \c -k is
    427427    /// assigned to \c t and all other nodes have zero supply value.
    428428    ///
  • lemon/core.h

    r893 r919  
    448448  }
    449449
    450   /// Check whether a graph is undirected.
     450  /// \brief Check whether a graph is undirected.
    451451  ///
    452452  /// This function returns \c true if the given graph is undirected.
  • lemon/cost_scaling.h

    r921 r922  
    9898  /// "preflow push-relabel" algorithm for the maximum flow problem.
    9999  ///
     100  /// In general, \ref NetworkSimplex and \ref CostScaling are the fastest
     101  /// implementations available in LEMON for this problem.
     102  ///
    100103  /// Most of the parameters of the problem (except for the digraph)
    101104  /// can be given using separate functions, and the algorithm can be
     
    117120  /// \warning All input data (capacities, supply values, and costs) must
    118121  /// be integer.
    119   /// \warning This algorithm does not support negative costs for such
    120   /// arcs that have infinite upper bound.
     122  /// \warning This algorithm does not support negative costs for
     123  /// arcs having infinite upper bound.
    121124  ///
    122125  /// \note %CostScaling provides three different internal methods,
     
    180183    /// relabel operation.
    181184    /// By default, the so called \ref PARTIAL_AUGMENT
    182     /// "Partial Augment-Relabel" method is used, which proved to be
     185    /// "Partial Augment-Relabel" method is used, which turned out to be
    183186    /// the most efficient and the most robust on various test inputs.
    184187    /// However, the other methods can be selected using the \ref run()
     
    449452    ///
    450453    /// Using this function has the same effect as using \ref supplyMap()
    451     /// with such a map in which \c k is assigned to \c s, \c -k is
     454    /// with a map in which \c k is assigned to \c s, \c -k is
    452455    /// assigned to \c t and all other nodes have zero supply value.
    453456    ///
  • lemon/cycle_canceling.h

    r921 r922  
    6969  /// \warning All input data (capacities, supply values, and costs) must
    7070  /// be integer.
    71   /// \warning This algorithm does not support negative costs for such
    72   /// arcs that have infinite upper bound.
     71  /// \warning This algorithm does not support negative costs for
     72  /// arcs having infinite upper bound.
    7373  ///
    7474  /// \note For more information about the three available methods,
     
    118118    /// \ref CycleCanceling provides three different cycle-canceling
    119119    /// methods. By default, \ref CANCEL_AND_TIGHTEN "Cancel and Tighten"
    120     /// is used, which proved to be the most efficient and the most robust
    121     /// on various test inputs.
     120    /// is used, which is by far the most efficient and the most robust.
    122121    /// However, the other methods can be selected using the \ref run()
    123122    /// function with the proper parameter.
     
    351350    ///
    352351    /// Using this function has the same effect as using \ref supplyMap()
    353     /// with such a map in which \c k is assigned to \c s, \c -k is
     352    /// with a map in which \c k is assigned to \c s, \c -k is
    354353    /// assigned to \c t and all other nodes have zero supply value.
    355354    ///
  • lemon/euler.h

    r877 r919  
    3737  ///Euler tour iterator for digraphs.
    3838
    39   /// \ingroup graph_prop
     39  /// \ingroup graph_properties
    4040  ///This iterator provides an Euler tour (Eulerian circuit) of a \e directed
    4141  ///graph (if there exists) and it converts to the \c Arc type of the digraph.
  • lemon/grosso_locatelli_pullan_mc.h

    r904 r918  
    4747  ///
    4848  /// This class provides a simple but highly efficient and robust heuristic
    49   /// method that quickly finds a large clique, but not necessarily the
     49  /// method that quickly finds a quite large clique, but not necessarily the
    5050  /// largest one.
     51  /// The algorithm performs a certain number of iterations to find several
     52  /// cliques and selects the largest one among them. Various limits can be
     53  /// specified to control the running time and the effectiveness of the
     54  /// search process.
    5155  ///
    5256  /// \tparam GR The undirected graph type the algorithm runs on.
     
    8589    };
    8690
     91    /// \brief Constants for the causes of search termination.
     92    ///
     93    /// Enum type containing constants for the different causes of search
     94    /// termination. The \ref run() function returns one of these values.
     95    enum TerminationCause {
     96
     97      /// The iteration count limit is reached.
     98      ITERATION_LIMIT,
     99
     100      /// The step count limit is reached.
     101      STEP_LIMIT,
     102
     103      /// The clique size limit is reached.
     104      SIZE_LIMIT
     105    };
     106
    87107  private:
    88108
     
    94114    // Note: vector<char> is used instead of vector<bool> for efficiency reasons
    95115
     116    // The underlying graph
    96117    const GR &_graph;
    97118    IntNodeMap _id;
     
    100121    BoolMatrix _gr;
    101122    int _n;
     123   
     124    // Search options
     125    bool _delta_based_restart;
     126    int _restart_delta_limit;
     127 
     128    // Search limits
     129    int _iteration_limit;
     130    int _step_limit;
     131    int _size_limit;
    102132
    103133    // The current clique
     
    381411    GrossoLocatelliPullanMc(const GR& graph) :
    382412      _graph(graph), _id(_graph), _rnd(rnd)
    383     {}
     413    {
     414      initOptions();
     415    }
    384416
    385417    /// \brief Constructor with random seed.
     
    392424    GrossoLocatelliPullanMc(const GR& graph, int seed) :
    393425      _graph(graph), _id(_graph), _rnd(seed)
    394     {}
     426    {
     427      initOptions();
     428    }
    395429
    396430    /// \brief Constructor with random number generator.
     
    403437    GrossoLocatelliPullanMc(const GR& graph, const Random& random) :
    404438      _graph(graph), _id(_graph), _rnd(random)
    405     {}
     439    {
     440      initOptions();
     441    }
    406442
    407443    /// \name Execution Control
     444    /// The \ref run() function can be used to execute the algorithm.\n
     445    /// The functions \ref iterationLimit(int), \ref stepLimit(int), and
     446    /// \ref sizeLimit(int) can be used to specify various limits for the
     447    /// search process.
     448   
    408449    /// @{
    409 
    410     /// \brief Runs the algorithm.
    411     ///
    412     /// This function runs the algorithm.
    413     ///
    414     /// \param step_num The maximum number of node selections (steps)
    415     /// during the search process.
    416     /// This parameter controls the running time and the success of the
    417     /// algorithm. For larger values, the algorithm runs slower but it more
     450   
     451    /// \brief Sets the maximum number of iterations.
     452    ///
     453    /// This function sets the maximum number of iterations.
     454    /// Each iteration of the algorithm finds a maximal clique (but not
     455    /// necessarily the largest one) by performing several search steps
     456    /// (node selections).
     457    ///
     458    /// This limit controls the running time and the success of the
     459    /// algorithm. For larger values, the algorithm runs slower, but it more
    418460    /// likely finds larger cliques. For smaller values, the algorithm is
    419461    /// faster but probably gives worse results.
     462    ///
     463    /// The default value is \c 1000.
     464    /// \c -1 means that number of iterations is not limited.
     465    ///
     466    /// \warning You should specify a reasonable limit for the number of
     467    /// iterations and/or the number of search steps.
     468    ///
     469    /// \return <tt>(*this)</tt>
     470    ///
     471    /// \sa stepLimit(int)
     472    /// \sa sizeLimit(int)
     473    GrossoLocatelliPullanMc& iterationLimit(int limit) {
     474      _iteration_limit = limit;
     475      return *this;
     476    }
     477   
     478    /// \brief Sets the maximum number of search steps.
     479    ///
     480    /// This function sets the maximum number of elementary search steps.
     481    /// Each iteration of the algorithm finds a maximal clique (but not
     482    /// necessarily the largest one) by performing several search steps
     483    /// (node selections).
     484    ///
     485    /// This limit controls the running time and the success of the
     486    /// algorithm. For larger values, the algorithm runs slower, but it more
     487    /// likely finds larger cliques. For smaller values, the algorithm is
     488    /// faster but probably gives worse results.
     489    ///
     490    /// The default value is \c -1, which means that number of steps
     491    /// is not limited explicitly. However, the number of iterations is
     492    /// limited and each iteration performs a finite number of search steps.
     493    ///
     494    /// \warning You should specify a reasonable limit for the number of
     495    /// iterations and/or the number of search steps.
     496    ///
     497    /// \return <tt>(*this)</tt>
     498    ///
     499    /// \sa iterationLimit(int)
     500    /// \sa sizeLimit(int)
     501    GrossoLocatelliPullanMc& stepLimit(int limit) {
     502      _step_limit = limit;
     503      return *this;
     504    }
     505   
     506    /// \brief Sets the desired clique size.
     507    ///
     508    /// This function sets the desired clique size that serves as a search
     509    /// limit. If a clique of this size (or a larger one) is found, then the
     510    /// algorithm terminates.
     511    ///
     512    /// This function is especially useful if you know an exact upper bound
     513    /// for the size of the cliques in the graph or if any clique above
     514    /// a certain size limit is sufficient for your application.
     515    ///
     516    /// The default value is \c -1, which means that the size limit is set to
     517    /// the number of nodes in the graph.
     518    ///
     519    /// \return <tt>(*this)</tt>
     520    ///
     521    /// \sa iterationLimit(int)
     522    /// \sa stepLimit(int)
     523    GrossoLocatelliPullanMc& sizeLimit(int limit) {
     524      _size_limit = limit;
     525      return *this;
     526    }
     527   
     528    /// \brief The maximum number of iterations.
     529    ///
     530    /// This function gives back the maximum number of iterations.
     531    /// \c -1 means that no limit is specified.
     532    ///
     533    /// \sa iterationLimit(int)
     534    int iterationLimit() const {
     535      return _iteration_limit;
     536    }
     537   
     538    /// \brief The maximum number of search steps.
     539    ///
     540    /// This function gives back the maximum number of search steps.
     541    /// \c -1 means that no limit is specified.
     542    ///
     543    /// \sa stepLimit(int)
     544    int stepLimit() const {
     545      return _step_limit;
     546    }
     547   
     548    /// \brief The desired clique size.
     549    ///
     550    /// This function gives back the desired clique size that serves as a
     551    /// search limit. \c -1 means that this limit is set to the number of
     552    /// nodes in the graph.
     553    ///
     554    /// \sa sizeLimit(int)
     555    int sizeLimit() const {
     556      return _size_limit;
     557    }
     558
     559    /// \brief Runs the algorithm.
     560    ///
     561    /// This function runs the algorithm. If one of the specified limits
     562    /// is reached, the search process terminates.
     563    ///
    420564    /// \param rule The node selection rule. For more information, see
    421565    /// \ref SelectionRule.
    422566    ///
    423     /// \return The size of the found clique.
    424     int run(int step_num = 100000,
    425             SelectionRule rule = PENALTY_BASED)
     567    /// \return The termination cause of the search. For more information,
     568    /// see \ref TerminationCause.
     569    TerminationCause run(SelectionRule rule = PENALTY_BASED)
    426570    {
    427571      init();
    428572      switch (rule) {
    429573        case RANDOM:
    430           return start<RandomSelectionRule>(step_num);
     574          return start<RandomSelectionRule>();
    431575        case DEGREE_BASED:
    432           return start<DegreeBasedSelectionRule>(step_num);
    433         case PENALTY_BASED:
    434           return start<PenaltyBasedSelectionRule>(step_num);
    435       }
    436       return 0; // avoid warning
     576          return start<DegreeBasedSelectionRule>();
     577        default:
     578          return start<PenaltyBasedSelectionRule>();
     579      }
    437580    }
    438581
     
    440583
    441584    /// \name Query Functions
     585    /// The results of the algorithm can be obtained using these functions.\n
     586    /// The run() function must be called before using them.
     587
    442588    /// @{
    443589
     
    531677
    532678  private:
     679 
     680    // Initialize search options and limits
     681    void initOptions() {
     682      // Search options
     683      _delta_based_restart = true;
     684      _restart_delta_limit = 4;
     685     
     686      // Search limits
     687      _iteration_limit = 1000;
     688      _step_limit = -1;             // this is disabled by default
     689      _size_limit = -1;             // this is disabled by default
     690    }
    533691
    534692    // Adds a node to the current clique
     
    587745    // Executes the algorithm
    588746    template <typename SelectionRuleImpl>
    589     int start(int max_select) {
    590       // Options for the restart rule
    591       const bool delta_based_restart = true;
    592       const int restart_delta_limit = 4;
    593 
    594       if (_n == 0) return 0;
     747    TerminationCause start() {
     748      if (_n == 0) return SIZE_LIMIT;
    595749      if (_n == 1) {
    596750        _best_clique[0] = true;
    597751        _best_size = 1;
    598         return _best_size;
    599       }
    600 
    601       // Iterated local search
     752        return SIZE_LIMIT;
     753      }
     754
     755      // Iterated local search algorithm
     756      const int max_size = _size_limit >= 0 ? _size_limit : _n;
     757      const int max_restart = _iteration_limit >= 0 ?
     758        _iteration_limit : std::numeric_limits<int>::max();
     759      const int max_select = _step_limit >= 0 ?
     760        _step_limit : std::numeric_limits<int>::max();
     761
    602762      SelectionRuleImpl sel_method(*this);
    603       int select = 0;
     763      int select = 0, restart = 0;
    604764      IntVector restart_nodes;
    605 
    606       while (select < max_select) {
     765      while (select < max_select && restart < max_restart) {
    607766
    608767        // Perturbation/restart
    609         if (delta_based_restart) {
     768        restart++;
     769        if (_delta_based_restart) {
    610770          restart_nodes.clear();
    611771          for (int i = 0; i != _n; i++) {
    612             if (_delta[i] >= restart_delta_limit)
     772            if (_delta[i] >= _restart_delta_limit)
    613773              restart_nodes.push_back(i);
    614774          }
     
    664824          _best_clique = _clique;
    665825          _best_size = _size;
    666           if (_best_size == _n) return _best_size;
     826          if (_best_size >= max_size) return SIZE_LIMIT;
    667827        }
    668828        sel_method.update();
    669829      }
    670830
    671       return _best_size;
     831      return (restart >= max_restart ? ITERATION_LIMIT : STEP_LIMIT);
    672832    }
    673833
  • lemon/network_simplex.h

    r921 r922  
    4848  /// flow problem.
    4949  ///
    50   /// In general, %NetworkSimplex is the fastest implementation available
    51   /// in LEMON for this problem.
    52   /// Moreover, it supports both directions of the supply/demand inequality
    53   /// constraints. For more information, see \ref SupplyType.
     50  /// In general, \ref NetworkSimplex and \ref CostScaling are the fastest
     51  /// implementations available in LEMON for this problem.
     52  /// Furthermore, this class supports both directions of the supply/demand
     53  /// inequality constraints. For more information, see \ref SupplyType.
    5454  ///
    5555  /// Most of the parameters of the problem (except for the digraph)
     
    127127    /// of the algorithm.
    128128    /// By default, \ref BLOCK_SEARCH "Block Search" is used, which
    129     /// proved to be the most efficient and the most robust on various
     129    /// turend out to be the most efficient and the most robust on various
    130130    /// test inputs.
    131131    /// However, another pivot rule can be selected using the \ref run()
     
    169169    typedef std::vector<Cost> CostVector;
    170170    typedef std::vector<signed char> CharVector;
    171     // Note: vector<signed char> is used instead of vector<ArcState> and 
     171    // Note: vector<signed char> is used instead of vector<ArcState> and
    172172    // vector<ArcDirection> for efficiency reasons
    173173
     
    736736    ///
    737737    /// \return <tt>(*this)</tt>
     738    ///
     739    /// \sa supplyType()
    738740    template<typename SupplyMap>
    739741    NetworkSimplex& supplyMap(const SupplyMap& map) {
     
    752754    ///
    753755    /// Using this function has the same effect as using \ref supplyMap()
    754     /// with such a map in which \c k is assigned to \c s, \c -k is
     756    /// with a map in which \c k is assigned to \c s, \c -k is
    755757    /// assigned to \c t and all other nodes have zero supply value.
    756758    ///
  • lemon/path.h

    r877 r920  
    4444  ///
    4545  /// In a sense, the path can be treated as a list of arcs. The
    46   /// lemon path type stores just this list. As a consequence, it
     46  /// LEMON path type stores just this list. As a consequence, it
    4747  /// cannot enumerate the nodes of the path and the source node of
    4848  /// a zero length path is undefined.
     
    136136    void clear() { head.clear(); tail.clear(); }
    137137
    138     /// \brief The nth arc.
     138    /// \brief The n-th arc.
    139139    ///
    140140    /// \pre \c n is in the <tt>[0..length() - 1]</tt> range.
     
    144144    }
    145145
    146     /// \brief Initialize arc iterator to point to the nth arc
     146    /// \brief Initialize arc iterator to point to the n-th arc
    147147    ///
    148148    /// \pre \c n is in the <tt>[0..length() - 1]</tt> range.
     
    232232  ///
    233233  /// In a sense, the path can be treated as a list of arcs. The
    234   /// lemon path type stores just this list. As a consequence it
     234  /// LEMON path type stores just this list. As a consequence it
    235235  /// cannot enumerate the nodes in the path and the zero length paths
    236236  /// cannot store the source.
     
    328328    void clear() { data.clear(); }
    329329
    330     /// \brief The nth arc.
     330    /// \brief The n-th arc.
    331331    ///
    332332    /// \pre \c n is in the <tt>[0..length() - 1]</tt> range.
     
    335335    }
    336336
    337     /// \brief  Initializes arc iterator to point to the nth arc.
     337    /// \brief  Initializes arc iterator to point to the n-th arc.
    338338    ArcIt nthIt(int n) const {
    339339      return ArcIt(*this, n);
     
    396396  ///
    397397  /// In a sense, the path can be treated as a list of arcs. The
    398   /// lemon path type stores just this list. As a consequence it
     398  /// LEMON path type stores just this list. As a consequence it
    399399  /// cannot enumerate the nodes in the path and the zero length paths
    400400  /// cannot store the source.
     
    505505    };
    506506
    507     /// \brief The nth arc.
    508     ///
    509     /// This function looks for the nth arc in O(n) time.
     507    /// \brief The n-th arc.
     508    ///
     509    /// This function looks for the n-th arc in O(n) time.
    510510    /// \pre \c n is in the <tt>[0..length() - 1]</tt> range.
    511511    const Arc& nth(int n) const {
     
    517517    }
    518518
    519     /// \brief Initializes arc iterator to point to the nth arc.
     519    /// \brief Initializes arc iterator to point to the n-th arc.
    520520    ArcIt nthIt(int n) const {
    521521      Node *node = first;
     
    736736  ///
    737737  /// In a sense, the path can be treated as a list of arcs. The
    738   /// lemon path type stores just this list. As a consequence it
     738  /// LEMON path type stores just this list. As a consequence it
    739739  /// cannot enumerate the nodes in the path and the source node of
    740740  /// a zero length path is undefined.
     
    832832    };
    833833
    834     /// \brief The nth arc.
     834    /// \brief The n-th arc.
    835835    ///
    836836    /// \pre \c n is in the <tt>[0..length() - 1]</tt> range.
     
    839839    }
    840840
    841     /// \brief The arc iterator pointing to the nth arc.
     841    /// \brief The arc iterator pointing to the n-th arc.
    842842    ArcIt nthIt(int n) const {
    843843      return ArcIt(*this, n);
     
    10431043  ///
    10441044  /// In a sense, the path can be treated as a list of arcs. The
    1045   /// lemon path type stores only this list. As a consequence, it
     1045  /// LEMON path type stores only this list. As a consequence, it
    10461046  /// cannot enumerate the nodes in the path and the zero length paths
    10471047  /// cannot have a source node.
  • test/max_clique_test.cc

    r904 r918  
    5959// Check with general graphs
    6060template <typename Param>
    61 void checkMaxCliqueGeneral(int max_sel, Param rule) {
     61void checkMaxCliqueGeneral(Param rule) {
    6262  typedef ListGraph GR;
    6363  typedef GrossoLocatelliPullanMc<GR> McAlg;
     
    6969    GR::NodeMap<bool> map(g);
    7070    McAlg mc(g);
    71     check(mc.run(max_sel, rule) == 0, "Wrong clique size");
     71    mc.iterationLimit(50);
     72    check(mc.run(rule) == McAlg::SIZE_LIMIT, "Wrong termination cause");
    7273    check(mc.cliqueSize() == 0, "Wrong clique size");
    7374    check(CliqueIt(mc) == INVALID, "Wrong CliqueNodeIt");
    7475
    7576    GR::Node u = g.addNode();
    76     check(mc.run(max_sel, rule) == 1, "Wrong clique size");
     77    check(mc.run(rule) == McAlg::SIZE_LIMIT, "Wrong termination cause");
    7778    check(mc.cliqueSize() == 1, "Wrong clique size");
    7879    mc.cliqueMap(map);
     
    8384   
    8485    GR::Node v = g.addNode();
    85     check(mc.run(max_sel, rule) == 1, "Wrong clique size");
     86    check(mc.run(rule) == McAlg::ITERATION_LIMIT, "Wrong termination cause");
    8687    check(mc.cliqueSize() == 1, "Wrong clique size");
    8788    mc.cliqueMap(map);
     
    9192
    9293    g.addEdge(u, v);
    93     check(mc.run(max_sel, rule) == 2, "Wrong clique size");
     94    check(mc.run(rule) == McAlg::SIZE_LIMIT, "Wrong termination cause");
    9495    check(mc.cliqueSize() == 2, "Wrong clique size");
    9596    mc.cliqueMap(map);
     
    111112   
    112113    McAlg mc(g);
    113     check(mc.run(max_sel, rule) == 4, "Wrong clique size");
     114    mc.iterationLimit(50);
     115    check(mc.run(rule) == McAlg::ITERATION_LIMIT, "Wrong termination cause");
    114116    check(mc.cliqueSize() == 4, "Wrong clique size");
    115117    mc.cliqueMap(map);
     
    128130// Check with full graphs
    129131template <typename Param>
    130 void checkMaxCliqueFullGraph(int max_sel, Param rule) {
     132void checkMaxCliqueFullGraph(Param rule) {
    131133  typedef FullGraph GR;
    132134  typedef GrossoLocatelliPullanMc<FullGraph> McAlg;
     
    137139    GR::NodeMap<bool> map(g);
    138140    McAlg mc(g);
    139     check(mc.run(max_sel, rule) == size, "Wrong clique size");
     141    check(mc.run(rule) == McAlg::SIZE_LIMIT, "Wrong termination cause");
    140142    check(mc.cliqueSize() == size, "Wrong clique size");
    141143    mc.cliqueMap(map);
     
    151153// Check with grid graphs
    152154template <typename Param>
    153 void checkMaxCliqueGridGraph(int max_sel, Param rule) {
     155void checkMaxCliqueGridGraph(Param rule) {
    154156  GridGraph g(5, 7);
    155157  GridGraph::NodeMap<char> map(g);
    156158  GrossoLocatelliPullanMc<GridGraph> mc(g);
    157   check(mc.run(max_sel, rule) == 2, "Wrong clique size");
     159 
     160  mc.iterationLimit(100);
     161  check(mc.run(rule) == mc.ITERATION_LIMIT, "Wrong termination cause");
     162  check(mc.cliqueSize() == 2, "Wrong clique size");
     163
     164  mc.stepLimit(100);
     165  check(mc.run(rule) == mc.STEP_LIMIT, "Wrong termination cause");
     166  check(mc.cliqueSize() == 2, "Wrong clique size");
     167
     168  mc.sizeLimit(2);
     169  check(mc.run(rule) == mc.SIZE_LIMIT, "Wrong termination cause");
    158170  check(mc.cliqueSize() == 2, "Wrong clique size");
    159171}
     
    161173
    162174int main() {
    163   checkMaxCliqueGeneral(50, GrossoLocatelliPullanMc<ListGraph>::RANDOM);
    164   checkMaxCliqueGeneral(50, GrossoLocatelliPullanMc<ListGraph>::DEGREE_BASED);
    165   checkMaxCliqueGeneral(50, GrossoLocatelliPullanMc<ListGraph>::PENALTY_BASED);
     175  checkMaxCliqueGeneral(GrossoLocatelliPullanMc<ListGraph>::RANDOM);
     176  checkMaxCliqueGeneral(GrossoLocatelliPullanMc<ListGraph>::DEGREE_BASED);
     177  checkMaxCliqueGeneral(GrossoLocatelliPullanMc<ListGraph>::PENALTY_BASED);
    166178
    167   checkMaxCliqueFullGraph(50, GrossoLocatelliPullanMc<FullGraph>::RANDOM);
    168   checkMaxCliqueFullGraph(50, GrossoLocatelliPullanMc<FullGraph>::DEGREE_BASED);
    169   checkMaxCliqueFullGraph(50, GrossoLocatelliPullanMc<FullGraph>::PENALTY_BASED);
     179  checkMaxCliqueFullGraph(GrossoLocatelliPullanMc<FullGraph>::RANDOM);
     180  checkMaxCliqueFullGraph(GrossoLocatelliPullanMc<FullGraph>::DEGREE_BASED);
     181  checkMaxCliqueFullGraph(GrossoLocatelliPullanMc<FullGraph>::PENALTY_BASED);
    170182                       
    171   checkMaxCliqueGridGraph(50, GrossoLocatelliPullanMc<GridGraph>::RANDOM);
    172   checkMaxCliqueGridGraph(50, GrossoLocatelliPullanMc<GridGraph>::DEGREE_BASED);
    173   checkMaxCliqueGridGraph(50, GrossoLocatelliPullanMc<GridGraph>::PENALTY_BASED);
     183  checkMaxCliqueGridGraph(GrossoLocatelliPullanMc<GridGraph>::RANDOM);
     184  checkMaxCliqueGridGraph(GrossoLocatelliPullanMc<GridGraph>::DEGREE_BASED);
     185  checkMaxCliqueGridGraph(GrossoLocatelliPullanMc<GridGraph>::PENALTY_BASED);
    174186                       
    175187  return 0;
Note: See TracChangeset for help on using the changeset viewer.