/* -*- mode: C++; indent-tabs-mode: nil; -*-
* This file is a part of LEMON, a generic C++ optimization library.
* Copyright (C) 2003-2008
* Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
* (Egervary Research Group on Combinatorial Optimization, EGRES).
* Permission to use, modify and distribute this software is granted
* provided that this copyright notice appears in all copies. For
* precise terms see the accompanying LICENSE file.
* This software is provided "AS IS" with no warranty of any kind,
* express or implied, and with no claim as to its suitability for any
#ifndef LEMON_BITS_LP_SOLVER_ID_H
#define LEMON_BITS_LP_SOLVER_ID_H
virtual int addId(LpIdImpl&) = 0;
virtual void eraseId(LpIdImpl&, int xn) = 0;
LpId(int min_index = 0) {
impl.first_index = min_index;
impl.cross.resize(impl.first_index);
LpId& operator=(const LpId& li) {
void setIdHandler(IdHandler& ih) {
int fixId(int fn) const {return impl.cross[fn];}
int floatingId(int xn) const {return impl.index[xn];}
int xn, fn = impl.cross.size();
if (impl.first_free == -1) {
impl.index.push_back(fn);
impl.first_free = impl.index[impl.first_free];
impl.cross.push_back(xn);
return id_handler->addId(impl);
impl.index[xn] = impl.first_free;
for(int i = fn + 1; i < int(impl.cross.size()); ++i) {
impl.cross[i - 1] = impl.cross[i];
impl.index[impl.cross[i]]--;
id_handler->eraseId(impl, xn);
void firstFloating(int& fn) const {
if (fn == int(impl.cross.size())) fn = -1;
void nextFloating(int& fn) const {
if (fn == int(impl.cross.size())) fn = -1;
void firstFix(int& xn) const {
xn = fn != -1 ? fixId(fn) : -1;
void nextFix(int& xn) const {
xn = fn != -1 ? fixId(fn) : -1;
class RelocateIdHandler : public LpId::IdHandler {
virtual int addId(LpIdImpl& impl) {
int xn, fn = impl.cross.size();
if (impl.first_free == -1) {
impl.index.push_back(fn);
impl.first_free = impl.index[impl.first_free];
impl.cross.push_back(xn);
virtual void eraseId(LpIdImpl& impl, int xn) {
impl.index[xn] = impl.first_free;
impl.cross[fn] = impl.cross.back();
impl.index[impl.cross.back()] = fn;