lemon/bits/solver_bits.h
author Alpar Juttner <alpar@cs.elte.hu>
Thu, 22 Jan 2009 14:46:15 +0000
changeset 554 e6ae4999cf22
child 566 c786cd201266
permissions -rw-r--r--
Suppress or fix VS2008 warnings + turn off faulty tests using CMAKE (#208)
deba@482
     1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
deba@482
     2
 *
deba@482
     3
 * This file is a part of LEMON, a generic C++ optimization library.
deba@482
     4
 *
deba@482
     5
 * Copyright (C) 2003-2008
deba@482
     6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
deba@482
     7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
deba@482
     8
 *
deba@482
     9
 * Permission to use, modify and distribute this software is granted
deba@482
    10
 * provided that this copyright notice appears in all copies. For
deba@482
    11
 * precise terms see the accompanying LICENSE file.
deba@482
    12
 *
deba@482
    13
 * This software is provided "AS IS" with no warranty of any kind,
deba@482
    14
 * express or implied, and with no claim as to its suitability for any
deba@482
    15
 * purpose.
deba@482
    16
 *
deba@482
    17
 */
deba@482
    18
deba@482
    19
#ifndef LEMON_BITS_SOLVER_BITS_H
deba@482
    20
#define LEMON_BITS_SOLVER_BITS_H
deba@482
    21
deba@482
    22
namespace lemon {
deba@482
    23
deba@482
    24
  namespace _solver_bits {
deba@482
    25
deba@482
    26
    class VarIndex {
deba@482
    27
    private:
deba@482
    28
      struct ItemT {
deba@482
    29
        int prev, next;
deba@482
    30
        int index;
deba@482
    31
      };
deba@482
    32
      std::vector<ItemT> items;
deba@482
    33
      int first_item, last_item, first_free_item;
deba@482
    34
deba@482
    35
      std::vector<int> cross;
deba@482
    36
deba@482
    37
    public:
deba@482
    38
deba@482
    39
      VarIndex()
deba@482
    40
        : first_item(-1), last_item(-1), first_free_item(-1) {
deba@482
    41
      }
deba@482
    42
deba@482
    43
      void clear() {
deba@482
    44
        first_item = -1;
deba@482
    45
        first_free_item = -1;
deba@482
    46
        items.clear();
deba@482
    47
        cross.clear();
deba@482
    48
      }
deba@482
    49
deba@482
    50
      int addIndex(int idx) {
deba@482
    51
        int n;
deba@482
    52
        if (first_free_item == -1) {
deba@482
    53
          n = items.size();
deba@482
    54
          items.push_back(ItemT());
deba@482
    55
        } else {
deba@482
    56
          n = first_free_item;
deba@482
    57
          first_free_item = items[n].next;
deba@482
    58
          if (first_free_item != -1) {
deba@482
    59
            items[first_free_item].prev = -1;
deba@482
    60
          }
deba@482
    61
        }
deba@482
    62
        items[n].index = idx;
deba@482
    63
        if (static_cast<int>(cross.size()) <= idx) {
deba@482
    64
          cross.resize(idx + 1, -1);
deba@482
    65
        }
deba@482
    66
        cross[idx] = n;
deba@482
    67
deba@482
    68
        items[n].prev = last_item;
deba@482
    69
        items[n].next = -1;
deba@482
    70
        if (last_item != -1) {
deba@482
    71
          items[last_item].next = n;
deba@482
    72
        } else {
deba@482
    73
          first_item = n;
deba@482
    74
        }
deba@482
    75
        last_item = n;
deba@482
    76
deba@482
    77
        return n;
deba@482
    78
      }
deba@482
    79
deba@482
    80
      int addIndex(int idx, int n) {
deba@482
    81
        while (n >= static_cast<int>(items.size())) {
deba@482
    82
          items.push_back(ItemT());
deba@482
    83
          items.back().prev = -1;
deba@482
    84
          items.back().next = first_free_item;
deba@482
    85
          if (first_free_item != -1) {
deba@482
    86
            items[first_free_item].prev = items.size() - 1;
deba@482
    87
          }
deba@482
    88
          first_free_item = items.size() - 1;
deba@482
    89
        }
deba@482
    90
        if (items[n].next != -1) {
deba@482
    91
          items[items[n].next].prev = items[n].prev;
deba@482
    92
        }
deba@482
    93
        if (items[n].prev != -1) {
deba@482
    94
          items[items[n].prev].next = items[n].next;
deba@482
    95
        } else {
deba@482
    96
          first_free_item = items[n].next;
deba@482
    97
        }
deba@482
    98
deba@482
    99
        items[n].index = idx;
deba@482
   100
        if (static_cast<int>(cross.size()) <= idx) {
deba@482
   101
          cross.resize(idx + 1, -1);
deba@482
   102
        }
deba@482
   103
        cross[idx] = n;
deba@482
   104
deba@482
   105
        items[n].prev = last_item;
deba@482
   106
        items[n].next = -1;
deba@482
   107
        if (last_item != -1) {
deba@482
   108
          items[last_item].next = n;
deba@482
   109
        } else {
deba@482
   110
          first_item = n;
deba@482
   111
        }
deba@482
   112
        last_item = n;
deba@482
   113
deba@482
   114
        return n;
deba@482
   115
      }
deba@482
   116
deba@482
   117
      void eraseIndex(int idx) {
deba@482
   118
        int n = cross[idx];
deba@482
   119
deba@482
   120
        if (items[n].prev != -1) {
deba@482
   121
          items[items[n].prev].next = items[n].next;
deba@482
   122
        } else {
deba@482
   123
          first_item = items[n].next;
deba@482
   124
        }
deba@482
   125
        if (items[n].next != -1) {
deba@482
   126
          items[items[n].next].prev = items[n].prev;
deba@482
   127
        } else {
deba@482
   128
          last_item = items[n].prev;
deba@482
   129
        }
deba@482
   130
deba@482
   131
        if (first_free_item != -1) {
deba@482
   132
          items[first_free_item].prev = n;
deba@482
   133
        }
deba@482
   134
        items[n].next = first_free_item;
deba@482
   135
        items[n].prev = -1;
deba@482
   136
        first_free_item = n;
deba@482
   137
deba@482
   138
        while (!cross.empty() && cross.back() == -1) {
deba@482
   139
          cross.pop_back();
deba@482
   140
        }
deba@482
   141
      }
deba@482
   142
deba@482
   143
      int maxIndex() const {
deba@482
   144
        return cross.size() - 1;
deba@482
   145
      }
deba@482
   146
deba@482
   147
      void shiftIndices(int idx) {
deba@482
   148
        for (int i = idx + 1; i < static_cast<int>(cross.size()); ++i) {
deba@482
   149
          cross[i - 1] = cross[i];
deba@482
   150
          if (cross[i] != -1) {
deba@482
   151
            --items[cross[i]].index;
deba@482
   152
          }
deba@482
   153
        }
deba@482
   154
        cross.back() = -1;
deba@482
   155
        cross.pop_back();
deba@482
   156
        while (!cross.empty() && cross.back() == -1) {
deba@482
   157
          cross.pop_back();
deba@482
   158
        }
deba@482
   159
      }
deba@482
   160
deba@482
   161
      void relocateIndex(int idx, int jdx) {
deba@482
   162
        cross[idx] = cross[jdx];
deba@482
   163
        items[cross[jdx]].index = idx;
deba@482
   164
        cross[jdx] = -1;
deba@482
   165
deba@482
   166
        while (!cross.empty() && cross.back() == -1) {
deba@482
   167
          cross.pop_back();
deba@482
   168
        }
deba@482
   169
      }
deba@482
   170
deba@482
   171
      int operator[](int idx) const {
deba@482
   172
        return cross[idx];
deba@482
   173
      }
deba@482
   174
deba@482
   175
      int operator()(int fdx) const {
deba@482
   176
        return items[fdx].index;
deba@482
   177
      }
deba@482
   178
deba@482
   179
      void firstItem(int& fdx) const {
deba@482
   180
        fdx = first_item;
deba@482
   181
      }
deba@482
   182
deba@482
   183
      void nextItem(int& fdx) const {
deba@482
   184
        fdx = items[fdx].next;
deba@482
   185
      }
deba@482
   186
deba@482
   187
    };
deba@482
   188
  }
deba@482
   189
}
deba@482
   190
deba@482
   191
#endif