COIN-OR::LEMON - Graph Library

Ticket #356: 4ac8f688b6fc.patch

File 4ac8f688b6fc.patch, 6.6 KB (added by Balazs Dezso, 14 years ago)

Fix multiple execution

  • lemon/matching.h

    # HG changeset patch
    # User Balazs Dezso <deba@inf.elte.hu>
    # Date 1268770330 -3600
    # Node ID 4ac8f688b6fc667817466a7dad4cce5e78721fae
    # Parent  2d9c6566a6048f887cd22e17f7c006eb0de40361
    Fix multiple execution in weighted matchings (#356)
    
    diff -r 2d9c6566a604 -r 4ac8f688b6fc lemon/matching.h
    a b  
    805805      if (!_matching) {
    806806        _matching = new MatchingMap(_graph);
    807807      }
     808
    808809      if (!_node_potential) {
    809810        _node_potential = new NodePotential(_graph);
    810811      }
     812
    811813      if (!_blossom_set) {
    812814        _blossom_index = new IntNodeMap(_graph);
    813815        _blossom_set = new BlossomSet(*_blossom_index);
    814816        _blossom_data = new RangeMap<BlossomData>(_blossom_num);
     817      } else if (_blossom_data->size() != _blossom_num) {
     818        delete _blossom_data;
     819        _blossom_data = new RangeMap<BlossomData>(_blossom_num);
    815820      }
    816821
    817822      if (!_node_index) {
    818823        _node_index = new IntNodeMap(_graph);
    819824        _node_heap_index = new IntArcMap(_graph);
    820825        _node_data = new RangeMap<NodeData>(_node_num,
    821                                               NodeData(*_node_heap_index));
     826                                            NodeData(*_node_heap_index));
     827      } else {
     828        delete _node_data;
     829        _node_data = new RangeMap<NodeData>(_node_num,
     830                                            NodeData(*_node_heap_index));
    822831      }
    823832
    824833      if (!_tree_set) {
    825834        _tree_set_index = new IntIntMap(_blossom_num);
    826835        _tree_set = new TreeSet(*_tree_set_index);
     836      } else {
     837        _tree_set_index->resize(_blossom_num);
    827838      }
     839
    828840      if (!_delta1) {
    829841        _delta1_index = new IntNodeMap(_graph);
    830842        _delta1 = new BinHeap<Value, IntNodeMap>(*_delta1_index);
    831843      }
     844
    832845      if (!_delta2) {
    833846        _delta2_index = new IntIntMap(_blossom_num);
    834847        _delta2 = new BinHeap<Value, IntIntMap>(*_delta2_index);
     848      } else {
     849        _delta2_index->resize(_blossom_num);
    835850      }
     851
    836852      if (!_delta3) {
    837853        _delta3_index = new IntEdgeMap(_graph);
    838854        _delta3 = new BinHeap<Value, IntEdgeMap>(*_delta3_index);
    839855      }
     856
    840857      if (!_delta4) {
    841858        _delta4_index = new IntIntMap(_blossom_num);
    842859        _delta4 = new BinHeap<Value, IntIntMap>(*_delta4_index);
     860      } else {
     861        _delta4_index->resize(_blossom_num);
    843862      }
    844863    }
    845864
     
    16851704    void init() {
    16861705      createStructures();
    16871706
     1707      _blossom_node_list.clear();
     1708      _blossom_potential.clear();
     1709
    16881710      for (ArcIt e(_graph); e != INVALID; ++e) {
    16891711        (*_node_heap_index)[e] = BinHeap<Value, IntArcMap>::PRE_HEAP;
    16901712      }
     
    16981720        (*_delta2_index)[i] = _delta2->PRE_HEAP;
    16991721        (*_delta4_index)[i] = _delta4->PRE_HEAP;
    17001722      }
     1723     
     1724      _delta1->clear();
     1725      _delta2->clear();
     1726      _delta3->clear();
     1727      _delta4->clear();
     1728      _blossom_set->clear();
     1729      _tree_set->clear();
    17011730
    17021731      int index = 0;
    17031732      for (NodeIt n(_graph); n != INVALID; ++n) {
     
    17091738          }
    17101739        }
    17111740        (*_node_index)[n] = index;
     1741        (*_node_data)[index].heap_index.clear();
     1742        (*_node_data)[index].heap.clear();
    17121743        (*_node_data)[index].pot = max;
    17131744        _delta1->push(n, max);
    17141745        int blossom =
     
    21982229      if (!_matching) {
    21992230        _matching = new MatchingMap(_graph);
    22002231      }
     2232
    22012233      if (!_node_potential) {
    22022234        _node_potential = new NodePotential(_graph);
    22032235      }
     2236
    22042237      if (!_blossom_set) {
    22052238        _blossom_index = new IntNodeMap(_graph);
    22062239        _blossom_set = new BlossomSet(*_blossom_index);
    22072240        _blossom_data = new RangeMap<BlossomData>(_blossom_num);
     2241      } else if (_blossom_data->size() != _blossom_num) {
     2242        delete _blossom_data;
     2243        _blossom_data = new RangeMap<BlossomData>(_blossom_num);
    22082244      }
    22092245
    22102246      if (!_node_index) {
     
    22122248        _node_heap_index = new IntArcMap(_graph);
    22132249        _node_data = new RangeMap<NodeData>(_node_num,
    22142250                                            NodeData(*_node_heap_index));
     2251      } else if (_node_data->size() != _node_num) {
     2252        delete _node_data;
     2253        _node_data = new RangeMap<NodeData>(_node_num,
     2254                                            NodeData(*_node_heap_index));
    22152255      }
    22162256
    22172257      if (!_tree_set) {
    22182258        _tree_set_index = new IntIntMap(_blossom_num);
    22192259        _tree_set = new TreeSet(*_tree_set_index);
     2260      } else {
     2261        _tree_set_index->resize(_blossom_num);
    22202262      }
     2263
    22212264      if (!_delta2) {
    22222265        _delta2_index = new IntIntMap(_blossom_num);
    22232266        _delta2 = new BinHeap<Value, IntIntMap>(*_delta2_index);
     2267      } else {
     2268        _delta2_index->resize(_blossom_num);
    22242269      }
     2270
    22252271      if (!_delta3) {
    22262272        _delta3_index = new IntEdgeMap(_graph);
    22272273        _delta3 = new BinHeap<Value, IntEdgeMap>(*_delta3_index);
    22282274      }
     2275
    22292276      if (!_delta4) {
    22302277        _delta4_index = new IntIntMap(_blossom_num);
    22312278        _delta4 = new BinHeap<Value, IntIntMap>(*_delta4_index);
     2279      } else {
     2280        _delta4_index->resize(_blossom_num);
    22322281      }
    22332282    }
    22342283
     
    29262975    void init() {
    29272976      createStructures();
    29282977
     2978      _blossom_node_list.clear();
     2979      _blossom_potential.clear();
     2980
    29292981      for (ArcIt e(_graph); e != INVALID; ++e) {
    29302982        (*_node_heap_index)[e] = BinHeap<Value, IntArcMap>::PRE_HEAP;
    29312983      }
     
    29372989        (*_delta4_index)[i] = _delta4->PRE_HEAP;
    29382990      }
    29392991
     2992      _delta2->clear();
     2993      _delta3->clear();
     2994      _delta4->clear();
     2995      _blossom_set->clear();
     2996      _tree_set->clear();
     2997
    29402998      int index = 0;
    29412999      for (NodeIt n(_graph); n != INVALID; ++n) {
    29423000        Value max = - std::numeric_limits<Value>::max();
     
    29473005          }
    29483006        }
    29493007        (*_node_index)[n] = index;
     3008        (*_node_data)[index].heap_index.clear();
     3009        (*_node_data)[index].heap.clear();
    29503010        (*_node_data)[index].pot = max;
    29513011        int blossom =
    29523012          _blossom_set->insert(n, std::numeric_limits<Value>::max());
  • lemon/unionfind.h

    diff -r 2d9c6566a604 -r 4ac8f688b6fc lemon/unionfind.h
    a b  
    12881288      : index(_index), first_class(-1),
    12891289        first_free_class(-1), first_free_node(-1) {}
    12901290
     1291    /// \brief Clears the union-find data structure
     1292    ///
     1293    /// Erase each item from the data structure.
     1294    void clear() {
     1295      nodes.clear();
     1296      classes.clear();
     1297      first_free_node = first_free_class = first_class = -1;
     1298    }
     1299
    12911300    /// \brief Insert a new node into a new component.
    12921301    ///
    12931302    /// Insert a new node into a new component.