diff --git a/cbits/coin/CbcBranchAllDifferent.cpp b/cbits/coin/CbcBranchAllDifferent.cpp
deleted file mode 100644
--- a/cbits/coin/CbcBranchAllDifferent.cpp
+++ /dev/null
@@ -1,156 +0,0 @@
-// $Id: CbcBranchAllDifferent.cpp 1902 2013-04-10 16:58:16Z stefan $
-// Copyright (C) 2004, International Business Machines
-// Corporation and others.  All Rights Reserved.
-// This code is licensed under the terms of the Eclipse Public License (EPL).
-
-// Edwin 11/13/2009-- carved out of CbcBranchCut
-
-#if defined(_MSC_VER)
-// Turn off compiler warning about long names
-#  pragma warning(disable:4786)
-#endif
-#include <cassert>
-#include <cstdlib>
-#include <cmath>
-#include <cfloat>
-//#define CBC_DEBUG
-
-#include "OsiSolverInterface.hpp"
-#include "CbcModel.hpp"
-#include "CbcMessage.hpp"
-#include "CbcBranchCut.hpp"
-#include "CoinSort.hpp"
-#include "CoinError.hpp"
-#include "CbcBranchAllDifferent.hpp"
-
-/** Default Constructor
-*/
-CbcBranchAllDifferent::CbcBranchAllDifferent ()
-        : CbcBranchCut(),
-        numberInSet_(0),
-        which_(NULL)
-{
-}
-
-/* Useful constructor - passed set of variables
-*/
-CbcBranchAllDifferent::CbcBranchAllDifferent (CbcModel * model, int numberInSet,
-        const int * members)
-        : CbcBranchCut(model)
-{
-    numberInSet_ = numberInSet;
-    which_ = CoinCopyOfArray(members, numberInSet_);
-}
-// Copy constructor
-CbcBranchAllDifferent::CbcBranchAllDifferent ( const CbcBranchAllDifferent & rhs)
-        : CbcBranchCut(rhs)
-{
-    numberInSet_ = rhs.numberInSet_;
-    which_ = CoinCopyOfArray(rhs.which_, numberInSet_);
-}
-
-// Clone
-CbcObject *
-CbcBranchAllDifferent::clone() const
-{
-    return new CbcBranchAllDifferent(*this);
-}
-
-// Assignment operator
-CbcBranchAllDifferent &
-CbcBranchAllDifferent::operator=( const CbcBranchAllDifferent & rhs)
-{
-    if (this != &rhs) {
-        CbcBranchCut::operator=(rhs);
-        delete [] which_;
-        numberInSet_ = rhs.numberInSet_;
-        which_ = CoinCopyOfArray(rhs.which_, numberInSet_);
-    }
-    return *this;
-}
-
-// Destructor
-CbcBranchAllDifferent::~CbcBranchAllDifferent ()
-{
-    delete [] which_;
-}
-CbcBranchingObject *
-CbcBranchAllDifferent::createCbcBranch(OsiSolverInterface * /*solver*/
-                                       , const OsiBranchingInformation * /*info*/,
-                                       int /*way*/)
-{
-    // by default way must be -1
-    //assert (way==-1);
-    const double * solution = model_->testSolution();
-    double * values = new double[numberInSet_];
-    int * which = new int[numberInSet_];
-    int i;
-    for (i = 0; i < numberInSet_; i++) {
-        int iColumn = which_[i];
-        values[i] = solution[iColumn];
-        which[i] = iColumn;
-    }
-    CoinSort_2(values, values + numberInSet_, which);
-    double last = -1.0;
-    double closest = 1.0;
-    int worst = -1;
-    for (i = 0; i < numberInSet_; i++) {
-        if (values[i] - last < closest) {
-            closest = values[i] - last;
-            worst = i - 1;
-        }
-        last = values[i];
-    }
-    assert (closest <= 0.99999);
-    OsiRowCut down;
-    down.setLb(-COIN_DBL_MAX);
-    down.setUb(-1.0);
-    int pair[2];
-    double elements[] = {1.0, -1.0};
-    pair[0] = which[worst];
-    pair[1] = which[worst+1];
-    delete [] values;
-    delete [] which;
-    down.setRow(2, pair, elements);
-    // up is same - just with rhs changed
-    OsiRowCut up = down;
-    up.setLb(1.0);
-    up.setUb(COIN_DBL_MAX);
-    // Say is not a fix type branch
-    CbcCutBranchingObject * newObject =
-        new CbcCutBranchingObject(model_, down, up, false);
-    if (model_->messageHandler()->logLevel() > 1)
-        printf("creating cut in CbcBranchCut\n");
-    return newObject;
-}
-double
-CbcBranchAllDifferent::infeasibility(const OsiBranchingInformation * /*info*/,
-                                     int &preferredWay) const
-{
-    preferredWay = -1;
-    //OsiSolverInterface * solver = model_->solver();
-    const double * solution = model_->testSolution();
-    //const double * lower = solver->getColLower();
-    //const double * upper = solver->getColUpper();
-    double * values = new double[numberInSet_];
-    int i;
-    for (i = 0; i < numberInSet_; i++) {
-        int iColumn = which_[i];
-        values[i] = solution[iColumn];
-    }
-    std::sort(values, values + numberInSet_);
-    double last = -1.0;
-    double closest = 1.0;
-    for (i = 0; i < numberInSet_; i++) {
-        if (values[i] - last < closest) {
-            closest = values[i] - last;
-        }
-        last = values[i];
-    }
-    delete [] values;
-    if (closest > 0.99999)
-        return 0.0;
-    else
-        return 0.5*(1.0 - closest);
-}
-
diff --git a/cbits/coin/CbcBranchToFixLots.cpp b/cbits/coin/CbcBranchToFixLots.cpp
deleted file mode 100644
--- a/cbits/coin/CbcBranchToFixLots.cpp
+++ /dev/null
@@ -1,571 +0,0 @@
-// $Id: CbcBranchToFixLots.cpp 1902 2013-04-10 16:58:16Z stefan $
-// Copyright (C) 2004, International Business Machines
-// Corporation and others.  All Rights Reserved.
-// This code is licensed under the terms of the Eclipse Public License (EPL).
-
-// Edwin 11/13/2009-- carved out of CbcBranchCut
-
-#if defined(_MSC_VER)
-// Turn off compiler warning about long names
-#  pragma warning(disable:4786)
-#endif
-#include <cassert>
-#include <cstdlib>
-#include <cmath>
-#include <cfloat>
-//#define CBC_DEBUG
-
-#include "OsiSolverInterface.hpp"
-#include "CbcModel.hpp"
-#include "CbcMessage.hpp"
-#include "CbcBranchCut.hpp"
-#include "CoinSort.hpp"
-#include "CoinError.hpp"
-#include "CbcBranchToFixLots.hpp"
-
-/** Default Constructor
-
-  Equivalent to an unspecified binary variable.
-*/
-CbcBranchToFixLots::CbcBranchToFixLots ()
-        : CbcBranchCut(),
-        djTolerance_(COIN_DBL_MAX),
-        fractionFixed_(1.0),
-        mark_(NULL),
-        depth_(-1),
-        numberClean_(0),
-        alwaysCreate_(false)
-{
-}
-
-/* Useful constructor - passed reduced cost tolerance and fraction we would like fixed.
-   Also depth level to do at.
-   Also passed number of 1 rows which when clean triggers fix
-   Always does if all 1 rows cleaned up and number>0 or if fraction columns reached
-   Also whether to create branch if can't reach fraction.
-*/
-CbcBranchToFixLots::CbcBranchToFixLots (CbcModel * model, double djTolerance,
-                                        double fractionFixed, int depth,
-                                        int numberClean,
-                                        const char * mark, bool alwaysCreate)
-        : CbcBranchCut(model)
-{
-    djTolerance_ = djTolerance;
-    fractionFixed_ = fractionFixed;
-    if (mark) {
-        int numberColumns = model->getNumCols();
-        mark_ = new char[numberColumns];
-        memcpy(mark_, mark, numberColumns);
-    } else {
-        mark_ = NULL;
-    }
-    depth_ = depth;
-    assert (model);
-    OsiSolverInterface * solver = model_->solver();
-    matrixByRow_ = *solver->getMatrixByRow();
-    numberClean_ = numberClean;
-    alwaysCreate_ = alwaysCreate;
-}
-// Copy constructor
-CbcBranchToFixLots::CbcBranchToFixLots ( const CbcBranchToFixLots & rhs)
-        : CbcBranchCut(rhs)
-{
-    djTolerance_ = rhs.djTolerance_;
-    fractionFixed_ = rhs.fractionFixed_;
-    int numberColumns = model_->getNumCols();
-    mark_ = CoinCopyOfArray(rhs.mark_, numberColumns);
-    matrixByRow_ = rhs.matrixByRow_;
-    depth_ = rhs.depth_;
-    numberClean_ = rhs.numberClean_;
-    alwaysCreate_ = rhs.alwaysCreate_;
-}
-
-// Clone
-CbcObject *
-CbcBranchToFixLots::clone() const
-{
-    return new CbcBranchToFixLots(*this);
-}
-
-// Assignment operator
-CbcBranchToFixLots &
-CbcBranchToFixLots::operator=( const CbcBranchToFixLots & rhs)
-{
-    if (this != &rhs) {
-        CbcBranchCut::operator=(rhs);
-        djTolerance_ = rhs.djTolerance_;
-        fractionFixed_ = rhs.fractionFixed_;
-        int numberColumns = model_->getNumCols();
-        delete [] mark_;
-        mark_ = CoinCopyOfArray(rhs.mark_, numberColumns);
-        matrixByRow_ = rhs.matrixByRow_;
-        depth_ = rhs.depth_;
-        numberClean_ = rhs.numberClean_;
-        alwaysCreate_ = rhs.alwaysCreate_;
-    }
-    return *this;
-}
-
-// Destructor
-CbcBranchToFixLots::~CbcBranchToFixLots ()
-{
-    delete [] mark_;
-}
-CbcBranchingObject *
-CbcBranchToFixLots::createCbcBranch(OsiSolverInterface * solver, const OsiBranchingInformation * /*info*/, int /*way*/)
-{
-    // by default way must be -1
-    //assert (way==-1);
-    //OsiSolverInterface * solver = model_->solver();
-    const double * solution = model_->testSolution();
-    const double * lower = solver->getColLower();
-    const double * upper = solver->getColUpper();
-    const double * dj = solver->getReducedCost();
-    int i;
-    int numberIntegers = model_->numberIntegers();
-    const int * integerVariable = model_->integerVariable();
-    double integerTolerance =
-        model_->getDblParam(CbcModel::CbcIntegerTolerance);
-    // make smaller ?
-    double tolerance = CoinMin(1.0e-8, integerTolerance);
-    // How many fixed are we aiming at
-    int wantedFixed = static_cast<int> (static_cast<double>(numberIntegers) * fractionFixed_);
-    int nSort = 0;
-    int numberFixed = 0;
-    int numberColumns = solver->getNumCols();
-    int * sort = new int[numberColumns];
-    double * dsort = new double[numberColumns];
-    if (djTolerance_ != -1.234567) {
-        int type = shallWe();
-        assert (type);
-        // Take clean first
-        if (type == 1) {
-            for (i = 0; i < numberIntegers; i++) {
-                int iColumn = integerVariable[i];
-                if (upper[iColumn] > lower[iColumn]) {
-                    if (!mark_ || !mark_[iColumn]) {
-                        if (solution[iColumn] < lower[iColumn] + tolerance) {
-                            if (dj[iColumn] > djTolerance_) {
-                                dsort[nSort] = -dj[iColumn];
-                                sort[nSort++] = iColumn;
-                            }
-                        } else if (solution[iColumn] > upper[iColumn] - tolerance) {
-                            if (dj[iColumn] < -djTolerance_) {
-                                dsort[nSort] = dj[iColumn];
-                                sort[nSort++] = iColumn;
-                            }
-                        }
-                    }
-                } else {
-                    numberFixed++;
-                }
-            }
-            // sort
-            CoinSort_2(dsort, dsort + nSort, sort);
-            nSort = CoinMin(nSort, wantedFixed - numberFixed);
-        } else if (type < 10) {
-            int i;
-            //const double * rowLower = solver->getRowLower();
-            const double * rowUpper = solver->getRowUpper();
-            // Row copy
-            const double * elementByRow = matrixByRow_.getElements();
-            const int * column = matrixByRow_.getIndices();
-            const CoinBigIndex * rowStart = matrixByRow_.getVectorStarts();
-            const int * rowLength = matrixByRow_.getVectorLengths();
-            const double * columnLower = solver->getColLower();
-            const double * columnUpper = solver->getColUpper();
-            const double * solution = solver->getColSolution();
-            int numberColumns = solver->getNumCols();
-            int numberRows = solver->getNumRows();
-            for (i = 0; i < numberColumns; i++) {
-                sort[i] = i;
-                if (columnLower[i] != columnUpper[i]) {
-                    dsort[i] = 1.0e100;
-                } else {
-                    dsort[i] = 1.0e50;
-                    numberFixed++;
-                }
-            }
-            for (i = 0; i < numberRows; i++) {
-                double rhsValue = rowUpper[i];
-                bool oneRow = true;
-                // check elements
-                int numberUnsatisfied = 0;
-                for (int j = rowStart[i]; j < rowStart[i] + rowLength[i]; j++) {
-                    int iColumn = column[j];
-                    double value = elementByRow[j];
-                    double solValue = solution[iColumn];
-                    if (columnLower[iColumn] != columnUpper[iColumn]) {
-                        if (solValue < 1.0 - integerTolerance && solValue > integerTolerance)
-                            numberUnsatisfied++;
-                        if (value != 1.0) {
-                            oneRow = false;
-                            break;
-                        }
-                    } else {
-                        rhsValue -= value * floor(solValue + 0.5);
-                    }
-                }
-                if (oneRow && rhsValue <= 1.0 + tolerance) {
-                    if (!numberUnsatisfied) {
-                        for (int j = rowStart[i]; j < rowStart[i] + rowLength[i]; j++) {
-                            int iColumn = column[j];
-                            if (dsort[iColumn] > 1.0e50) {
-                                dsort[iColumn] = 0;
-                                nSort++;
-                            }
-                        }
-                    }
-                }
-            }
-            // sort
-            CoinSort_2(dsort, dsort + numberColumns, sort);
-        } else {
-            // new way
-            for (i = 0; i < numberIntegers; i++) {
-                int iColumn = integerVariable[i];
-                if (upper[iColumn] > lower[iColumn]) {
-                    if (!mark_ || !mark_[iColumn]) {
-                        double distanceDown = solution[iColumn] - lower[iColumn];
-                        double distanceUp = upper[iColumn] - solution[iColumn];
-                        double distance = CoinMin(distanceDown, distanceUp);
-                        if (distance > 0.001 && distance < 0.5) {
-                            dsort[nSort] = distance;
-                            sort[nSort++] = iColumn;
-                        }
-                    }
-                }
-            }
-            // sort
-            CoinSort_2(dsort, dsort + nSort, sort);
-            int n = 0;
-            double sum = 0.0;
-            for (int k = 0; k < nSort; k++) {
-                sum += dsort[k];
-                if (sum <= djTolerance_)
-                    n = k;
-                else
-                    break;
-            }
-            nSort = CoinMin(n, numberClean_ / 1000000);
-        }
-    } else {
-#define FIX_IF_LESS -0.1
-        // 3 in same row and sum <FIX_IF_LESS?
-        int numberRows = matrixByRow_.getNumRows();
-        const double * solution = model_->testSolution();
-        const int * column = matrixByRow_.getIndices();
-        const CoinBigIndex * rowStart = matrixByRow_.getVectorStarts();
-        const int * rowLength = matrixByRow_.getVectorLengths();
-        double bestSum = 1.0;
-        int nBest = -1;
-        int kRow = -1;
-        OsiSolverInterface * solver = model_->solver();
-        for (int i = 0; i < numberRows; i++) {
-            int numberUnsatisfied = 0;
-            double sum = 0.0;
-            for (int j = rowStart[i]; j < rowStart[i] + rowLength[i]; j++) {
-                int iColumn = column[j];
-                if (solver->isInteger(iColumn)) {
-                    double solValue = solution[iColumn];
-                    if (solValue > 1.0e-5 && solValue < FIX_IF_LESS) {
-                        numberUnsatisfied++;
-                        sum += solValue;
-                    }
-                }
-            }
-            if (numberUnsatisfied >= 3 && sum < FIX_IF_LESS) {
-                // possible
-                if (numberUnsatisfied > nBest ||
-                        (numberUnsatisfied == nBest && sum < bestSum)) {
-                    nBest = numberUnsatisfied;
-                    bestSum = sum;
-                    kRow = i;
-                }
-            }
-        }
-        assert (nBest > 0);
-        for (int j = rowStart[kRow]; j < rowStart[kRow] + rowLength[kRow]; j++) {
-            int iColumn = column[j];
-            if (solver->isInteger(iColumn)) {
-                double solValue = solution[iColumn];
-                if (solValue > 1.0e-5 && solValue < FIX_IF_LESS) {
-                    sort[nSort++] = iColumn;
-                }
-            }
-        }
-    }
-    OsiRowCut down;
-    down.setLb(-COIN_DBL_MAX);
-    double rhs = 0.0;
-    for (i = 0; i < nSort; i++) {
-        int iColumn = sort[i];
-        double distanceDown = solution[iColumn] - lower[iColumn];
-        double distanceUp = upper[iColumn] - solution[iColumn];
-        if (distanceDown < distanceUp) {
-            rhs += lower[iColumn];
-            dsort[i] = 1.0;
-        } else {
-            rhs -= upper[iColumn];
-            dsort[i] = -1.0;
-        }
-    }
-    down.setUb(rhs);
-    down.setRow(nSort, sort, dsort);
-    down.setEffectiveness(COIN_DBL_MAX); // so will persist
-    delete [] sort;
-    delete [] dsort;
-    // up is same - just with rhs changed
-    OsiRowCut up = down;
-    up.setLb(rhs + 1.0);
-    up.setUb(COIN_DBL_MAX);
-    // Say can fix one way
-    CbcCutBranchingObject * newObject =
-        new CbcCutBranchingObject(model_, down, up, true);
-    if (model_->messageHandler()->logLevel() > 1)
-        printf("creating cut in CbcBranchCut\n");
-    return newObject;
-}
-/* Does a lot of the work,
-   Returns 0 if no good, 1 if dj, 2 if clean, 3 if both
-   10 if branching on ones away from bound
-*/
-int
-CbcBranchToFixLots::shallWe() const
-{
-    int returnCode = 0;
-    OsiSolverInterface * solver = model_->solver();
-    int numberRows = matrixByRow_.getNumRows();
-    //if (numberRows!=solver->getNumRows())
-    //return 0;
-    const double * solution = model_->testSolution();
-    const double * lower = solver->getColLower();
-    const double * upper = solver->getColUpper();
-    const double * dj = solver->getReducedCost();
-    int i;
-    int numberIntegers = model_->numberIntegers();
-    const int * integerVariable = model_->integerVariable();
-    if (numberClean_ > 1000000) {
-        int wanted = numberClean_ % 1000000;
-        int * sort = new int[numberIntegers];
-        double * dsort = new double[numberIntegers];
-        int nSort = 0;
-        for (i = 0; i < numberIntegers; i++) {
-            int iColumn = integerVariable[i];
-            if (upper[iColumn] > lower[iColumn]) {
-                if (!mark_ || !mark_[iColumn]) {
-                    double distanceDown = solution[iColumn] - lower[iColumn];
-                    double distanceUp = upper[iColumn] - solution[iColumn];
-                    double distance = CoinMin(distanceDown, distanceUp);
-                    if (distance > 0.001 && distance < 0.5) {
-                        dsort[nSort] = distance;
-                        sort[nSort++] = iColumn;
-                    }
-                }
-            }
-        }
-        // sort
-        CoinSort_2(dsort, dsort + nSort, sort);
-        int n = 0;
-        double sum = 0.0;
-        for (int k = 0; k < nSort; k++) {
-            sum += dsort[k];
-            if (sum <= djTolerance_)
-                n = k;
-            else
-                break;
-        }
-        delete [] sort;
-        delete [] dsort;
-        return (n >= wanted) ? 10 : 0;
-    }
-    double integerTolerance =
-        model_->getDblParam(CbcModel::CbcIntegerTolerance);
-    // make smaller ?
-    double tolerance = CoinMin(1.0e-8, integerTolerance);
-    // How many fixed are we aiming at
-    int wantedFixed = static_cast<int> (static_cast<double>(numberIntegers) * fractionFixed_);
-    if (djTolerance_ < 1.0e10) {
-        int nSort = 0;
-        int numberFixed = 0;
-        for (i = 0; i < numberIntegers; i++) {
-            int iColumn = integerVariable[i];
-            if (upper[iColumn] > lower[iColumn]) {
-                if (!mark_ || !mark_[iColumn]) {
-                    if (solution[iColumn] < lower[iColumn] + tolerance) {
-                        if (dj[iColumn] > djTolerance_) {
-                            nSort++;
-                        }
-                    } else if (solution[iColumn] > upper[iColumn] - tolerance) {
-                        if (dj[iColumn] < -djTolerance_) {
-                            nSort++;
-                        }
-                    }
-                }
-            } else {
-                numberFixed++;
-            }
-        }
-        if (numberFixed + nSort < wantedFixed && !alwaysCreate_) {
-            returnCode = 0;
-        } else if (numberFixed < wantedFixed) {
-            returnCode = 1;
-        } else {
-            returnCode = 0;
-        }
-    }
-    if (numberClean_) {
-        // see how many rows clean
-        int i;
-        //const double * rowLower = solver->getRowLower();
-        const double * rowUpper = solver->getRowUpper();
-        // Row copy
-        const double * elementByRow = matrixByRow_.getElements();
-        const int * column = matrixByRow_.getIndices();
-        const CoinBigIndex * rowStart = matrixByRow_.getVectorStarts();
-        const int * rowLength = matrixByRow_.getVectorLengths();
-        const double * columnLower = solver->getColLower();
-        const double * columnUpper = solver->getColUpper();
-        const double * solution = solver->getColSolution();
-        int numberClean = 0;
-        bool someToDoYet = false;
-        int numberColumns = solver->getNumCols();
-        char * mark = new char[numberColumns];
-        int numberFixed = 0;
-        for (i = 0; i < numberColumns; i++) {
-            if (columnLower[i] != columnUpper[i]) {
-                mark[i] = 0;
-            } else {
-                mark[i] = 1;
-                numberFixed++;
-            }
-        }
-        int numberNewFixed = 0;
-        for (i = 0; i < numberRows; i++) {
-            double rhsValue = rowUpper[i];
-            bool oneRow = true;
-            // check elements
-            int numberUnsatisfied = 0;
-            for (int j = rowStart[i]; j < rowStart[i] + rowLength[i]; j++) {
-                int iColumn = column[j];
-                double value = elementByRow[j];
-                double solValue = solution[iColumn];
-                if (columnLower[iColumn] != columnUpper[iColumn]) {
-                    if (solValue < 1.0 - integerTolerance && solValue > integerTolerance)
-                        numberUnsatisfied++;
-                    if (value != 1.0) {
-                        oneRow = false;
-                        break;
-                    }
-                } else {
-                    rhsValue -= value * floor(solValue + 0.5);
-                }
-            }
-            if (oneRow && rhsValue <= 1.0 + tolerance) {
-                if (numberUnsatisfied) {
-                    someToDoYet = true;
-                } else {
-                    numberClean++;
-                    for (int j = rowStart[i]; j < rowStart[i] + rowLength[i]; j++) {
-                        int iColumn = column[j];
-                        if (columnLower[iColumn] != columnUpper[iColumn] && !mark[iColumn]) {
-                            mark[iColumn] = 1;
-                            numberNewFixed++;
-                        }
-                    }
-                }
-            }
-        }
-        delete [] mark;
-        //printf("%d clean, %d old fixed, %d new fixed\n",
-        //   numberClean,numberFixed,numberNewFixed);
-        if (someToDoYet && numberClean < numberClean_
-                && numberNewFixed + numberFixed < wantedFixed) {
-        } else if (numberFixed < wantedFixed) {
-            returnCode |= 2;
-        } else {
-        }
-    }
-    return returnCode;
-}
-double
-CbcBranchToFixLots::infeasibility(const OsiBranchingInformation * /*info*/,
-                                  int &preferredWay) const
-{
-    preferredWay = -1;
-    CbcNode * node = model_->currentNode();
-    int depth;
-    if (node)
-        depth = CoinMax(node->depth(), 0);
-    else
-        return 0.0;
-    if (depth_ < 0) {
-        return 0.0;
-    } else if (depth_ > 0) {
-        if ((depth % depth_) != 0)
-            return 0.0;
-    }
-    if (djTolerance_ != -1.234567) {
-        if (!shallWe())
-            return 0.0;
-        else
-            return 1.0e20;
-    } else {
-        // See if 3 in same row and sum <FIX_IF_LESS?
-        int numberRows = matrixByRow_.getNumRows();
-        const double * solution = model_->testSolution();
-        const int * column = matrixByRow_.getIndices();
-        const CoinBigIndex * rowStart = matrixByRow_.getVectorStarts();
-        const int * rowLength = matrixByRow_.getVectorLengths();
-        double bestSum = 1.0;
-        int nBest = -1;
-        OsiSolverInterface * solver = model_->solver();
-        for (int i = 0; i < numberRows; i++) {
-            int numberUnsatisfied = 0;
-            double sum = 0.0;
-            for (int j = rowStart[i]; j < rowStart[i] + rowLength[i]; j++) {
-                int iColumn = column[j];
-                if (solver->isInteger(iColumn)) {
-                    double solValue = solution[iColumn];
-                    if (solValue > 1.0e-5 && solValue < FIX_IF_LESS) {
-                        numberUnsatisfied++;
-                        sum += solValue;
-                    }
-                }
-            }
-            if (numberUnsatisfied >= 3 && sum < FIX_IF_LESS) {
-                // possible
-                if (numberUnsatisfied > nBest ||
-                        (numberUnsatisfied == nBest && sum < bestSum)) {
-                    nBest = numberUnsatisfied;
-                    bestSum = sum;
-                }
-            }
-        }
-        if (nBest > 0)
-            return 1.0e20;
-        else
-            return 0.0;
-    }
-}
-// Redoes data when sequence numbers change
-void
-CbcBranchToFixLots::redoSequenceEtc(CbcModel * model, int numberColumns, const int * originalColumns)
-{
-    model_ = model;
-    if (mark_) {
-        OsiSolverInterface * solver = model_->solver();
-        int numberColumnsNow = solver->getNumCols();
-        char * temp = new char[numberColumnsNow];
-        memset(temp, 0, numberColumnsNow);
-        for (int i = 0; i < numberColumns; i++) {
-            int j = originalColumns[i];
-            temp[i] = mark_[j];
-        }
-        delete [] mark_;
-        mark_ = temp;
-    }
-    OsiSolverInterface * solver = model_->solver();
-    matrixByRow_ = *solver->getMatrixByRow();
-}
-
diff --git a/cbits/coin/CbcCbcParam.cpp b/cbits/coin/CbcCbcParam.cpp
deleted file mode 100644
--- a/cbits/coin/CbcCbcParam.cpp
+++ /dev/null
@@ -1,11 +0,0 @@
-/* $Id: CbcCbcParam.cpp 1902 2013-04-10 16:58:16Z stefan $ */
-// Copyright (C) 2007, International Business Machines
-// Corporation and others.  All Rights Reserved.
-// This code is licensed under the terms of the Eclipse Public License (EPL).
-
-#include "CbcConfig.h"
-#ifndef COIN_HAS_CBC
-#define COIN_HAS_CBC
-#endif
-#include "CbcOrClpParam.cpp"
-
diff --git a/cbits/coin/CbcCompareEstimate.cpp b/cbits/coin/CbcCompareEstimate.cpp
deleted file mode 100644
--- a/cbits/coin/CbcCompareEstimate.cpp
+++ /dev/null
@@ -1,82 +0,0 @@
-// $Id: CbcCompareEstimate.cpp 1902 2013-04-10 16:58:16Z stefan $
-// Copyright (C) 2002, International Business Machines
-// Corporation and others.  All Rights Reserved.
-// This code is licensed under the terms of the Eclipse Public License (EPL).
-
-//Edwin 11/25/09 carved out of CbcCompareActual
-
-#if defined(_MSC_VER)
-// Turn off compiler warning about long names
-#  pragma warning(disable:4786)
-#endif
-#include <cassert>
-#include <cstdlib>
-#include <cmath>
-#include <cfloat>
-//#define CBC_DEBUG
-
-#include "CbcMessage.hpp"
-#include "CbcModel.hpp"
-#include "CbcTree.hpp"
-#include "CbcCompareActual.hpp"
-#include "CoinError.hpp"
-#include "CbcCompareEstimate.hpp"
-/** Default Constructor
-
-*/
-CbcCompareEstimate::CbcCompareEstimate ()
-        : CbcCompareBase()
-{
-    test_ = this;
-}
-
-// Copy constructor
-CbcCompareEstimate::CbcCompareEstimate ( const CbcCompareEstimate & rhs)
-        : CbcCompareBase(rhs)
-
-{
-}
-
-// Clone
-CbcCompareBase *
-CbcCompareEstimate::clone() const
-{
-    return new CbcCompareEstimate(*this);
-}
-
-// Assignment operator
-CbcCompareEstimate &
-CbcCompareEstimate::operator=( const CbcCompareEstimate & rhs)
-{
-    if (this != &rhs) {
-        CbcCompareBase::operator=(rhs);
-    }
-    return *this;
-}
-
-// Destructor
-CbcCompareEstimate::~CbcCompareEstimate ()
-{
-}
-
-// Returns true if y better than x
-bool
-CbcCompareEstimate::test (CbcNode * x, CbcNode * y)
-{
-    double testX = x->guessedObjectiveValue();
-    double testY = y->guessedObjectiveValue();
-    if (testX != testY)
-        return testX > testY;
-    else
-        return equalityTest(x, y); // so ties will be broken in consistent manner
-}
-
-// Create C++ lines to get to current state
-void
-CbcCompareEstimate::generateCpp( FILE * fp)
-{
-    fprintf(fp, "0#include \"CbcCompareActual.hpp\"\n");
-    fprintf(fp, "3  CbcCompareEstimate compare;\n");
-    fprintf(fp, "3  cbcModel->setNodeComparison(compare);\n");
-}
-
diff --git a/cbits/coin/CbcCompareObjective.cpp b/cbits/coin/CbcCompareObjective.cpp
deleted file mode 100644
--- a/cbits/coin/CbcCompareObjective.cpp
+++ /dev/null
@@ -1,80 +0,0 @@
-// $Id: CbcCompareObjective.cpp 1902 2013-04-10 16:58:16Z stefan $
-// Copyright (C) 2002, International Business Machines
-// Corporation and others.  All Rights Reserved.
-// This code is licensed under the terms of the Eclipse Public License (EPL).
-
-//Edwin 11/25/09 carved out of CbcCompareActual
-
-#if defined(_MSC_VER)
-// Turn off compiler warning about long names
-#  pragma warning(disable:4786)
-#endif
-#include <cassert>
-#include <cstdlib>
-#include <cmath>
-#include <cfloat>
-//#define CBC_DEBUG
-
-#include "CbcMessage.hpp"
-#include "CbcModel.hpp"
-#include "CbcTree.hpp"
-#include "CbcCompareActual.hpp"
-#include "CoinError.hpp"
-#include "CbcCompareObjective.hpp"
-/** Default Constructor
-
-*/
-CbcCompareObjective::CbcCompareObjective ()
-        : CbcCompareBase()
-{
-    test_ = this;
-}
-
-// Copy constructor
-CbcCompareObjective::CbcCompareObjective ( const CbcCompareObjective & rhs)
-        : CbcCompareBase(rhs)
-
-{
-}
-
-// Clone
-CbcCompareBase *
-CbcCompareObjective::clone() const
-{
-    return new CbcCompareObjective(*this);
-}
-
-// Assignment operator
-CbcCompareObjective &
-CbcCompareObjective::operator=( const CbcCompareObjective & rhs)
-{
-    if (this != &rhs) {
-        CbcCompareBase::operator=(rhs);
-    }
-    return *this;
-}
-
-// Destructor
-CbcCompareObjective::~CbcCompareObjective ()
-{
-}
-
-// Returns true if y better than x
-bool
-CbcCompareObjective::test (CbcNode * x, CbcNode * y)
-{
-    double testX = x->objectiveValue();
-    double testY = y->objectiveValue();
-    if (testX != testY)
-        return testX > testY;
-    else
-        return equalityTest(x, y); // so ties will be broken in consistent manner
-}
-// Create C++ lines to get to current state
-void
-CbcCompareObjective::generateCpp( FILE * fp)
-{
-    fprintf(fp, "0#include \"CbcCompareActual.hpp\"\n");
-    fprintf(fp, "3  CbcCompareObjective compare;\n");
-    fprintf(fp, "3  cbcModel->setNodeComparison(compare);\n");
-}
diff --git a/cbits/coin/CbcCutSubsetModifier.cpp b/cbits/coin/CbcCutSubsetModifier.cpp
deleted file mode 100644
--- a/cbits/coin/CbcCutSubsetModifier.cpp
+++ /dev/null
@@ -1,109 +0,0 @@
-// $Id: CbcCutSubsetModifier.cpp 1902 2013-04-10 16:58:16Z stefan $
-// Copyright (C) 2003, International Business Machines
-// Corporation and others.  All Rights Reserved.
-// This code is licensed under the terms of the Eclipse Public License (EPL).
-
-//Edwin 11/25/09 carved out of CbcCutGenerator
-
-#if defined(_MSC_VER)
-// Turn off compiler warning about long names
-#  pragma warning(disable:4786)
-#endif
-#include "CbcConfig.h"
-#include <cassert>
-#include <cstdlib>
-#include <cmath>
-#include <cfloat>
-
-#ifdef COIN_HAS_CLP
-#include "OsiClpSolverInterface.hpp"
-#else
-#include "OsiSolverInterface.hpp"
-#endif
-#include "CbcModel.hpp"
-#include "CbcMessage.hpp"
-#include "CbcCutGenerator.hpp"
-#include "CbcBranchDynamic.hpp"
-#include "CglProbing.hpp"
-#include "CoinTime.hpp"
-#include "CbcCutSubsetModifier.hpp"
-
-// Default Constructor
-CbcCutSubsetModifier::CbcCutSubsetModifier ()
-        : CbcCutModifier(),
-        firstOdd_(COIN_INT_MAX)
-{
-}
-
-// Useful constructor
-CbcCutSubsetModifier::CbcCutSubsetModifier (int firstOdd)
-        : CbcCutModifier()
-{
-    firstOdd_ = firstOdd;
-}
-
-// Copy constructor
-CbcCutSubsetModifier::CbcCutSubsetModifier ( const CbcCutSubsetModifier & rhs)
-        : CbcCutModifier(rhs)
-{
-    firstOdd_ = rhs.firstOdd_;
-}
-
-// Clone
-CbcCutModifier *
-CbcCutSubsetModifier::clone() const
-{
-    return new CbcCutSubsetModifier(*this);
-}
-
-// Assignment operator
-CbcCutSubsetModifier &
-CbcCutSubsetModifier::operator=( const CbcCutSubsetModifier & rhs)
-{
-    if (this != &rhs) {
-        CbcCutModifier::operator=(rhs);
-        firstOdd_ = rhs.firstOdd_;
-    }
-    return *this;
-}
-
-// Destructor
-CbcCutSubsetModifier::~CbcCutSubsetModifier ()
-{
-}
-/* Returns
-   0 unchanged
-   1 strengthened
-   2 weakened
-   3 deleted
-*/
-int
-CbcCutSubsetModifier::modify(const OsiSolverInterface * /*solver*/,
-                             OsiRowCut & cut)
-{
-    int n = cut.row().getNumElements();
-    if (!n)
-        return 0;
-    const int * column = cut.row().getIndices();
-    //const double * element = cut.row().getElements();
-    int returnCode = 0;
-    for (int i = 0; i < n; i++) {
-        if (column[i] >= firstOdd_) {
-            returnCode = 3;
-            break;
-        }
-    }
-#ifdef COIN_DETAIL
-    if (!returnCode) {
-        const double * element = cut.row().getElements();
-        printf("%g <= ", cut.lb());
-        for (int i = 0; i < n; i++) {
-            printf("%g*x%d ", element[i], column[i]);
-        }
-        printf("<= %g\n", cut.ub());
-    }
-#endif
-    //return 3;
-    return returnCode;
-}
-
diff --git a/cbits/coin/CbcFathomDynamicProgramming.cpp b/cbits/coin/CbcFathomDynamicProgramming.cpp
deleted file mode 100644
--- a/cbits/coin/CbcFathomDynamicProgramming.cpp
+++ /dev/null
@@ -1,1055 +0,0 @@
-/*
-  $Id: CbcFathomDynamicProgramming.cpp 1888 2013-04-06 20:52:59Z stefan $
-*/
-// Copyright (C) 2004, International Business Machines
-// Corporation and others.  All Rights Reserved.
-// This code is licensed under the terms of the Eclipse Public License (EPL).
-
-#if defined(_MSC_VER)
-// Turn off compiler warning about long names
-#  pragma warning(disable:4786)
-#endif
-#include <cassert>
-#include <cstdlib>
-#include <cmath>
-#include <cfloat>
-
-#include "OsiSolverInterface.hpp"
-#include "CbcModel.hpp"
-#include "CbcMessage.hpp"
-#include "CbcFathomDynamicProgramming.hpp"
-#include "CoinHelperFunctions.hpp"
-#include "CoinPackedMatrix.hpp"
-#include "CoinSort.hpp"
-// Default Constructor
-CbcFathomDynamicProgramming::CbcFathomDynamicProgramming()
-        : CbcFathom(),
-        size_(0),
-        type_(-1),
-        cost_(NULL),
-        back_(NULL),
-        lookup_(NULL),
-        indices_(NULL),
-        numberActive_(0),
-        maximumSizeAllowed_(1000000),
-        startBit_(NULL),
-        numberBits_(NULL),
-        rhs_(NULL),
-        coefficients_(NULL),
-        target_(0),
-        numberNonOne_(0),
-        bitPattern_(0),
-        algorithm_(-1)
-{
-
-}
-
-// Constructor from model
-CbcFathomDynamicProgramming::CbcFathomDynamicProgramming(CbcModel & model)
-        : CbcFathom(model),
-        cost_(NULL),
-        back_(NULL),
-        lookup_(NULL),
-        indices_(NULL),
-        numberActive_(0),
-        maximumSizeAllowed_(1000000),
-        startBit_(NULL),
-        numberBits_(NULL),
-        rhs_(NULL),
-        coefficients_(NULL),
-        target_(0),
-        numberNonOne_(0),
-        bitPattern_(0),
-        algorithm_(-1)
-{
-    type_ = checkPossible();
-}
-
-// Destructor
-CbcFathomDynamicProgramming::~CbcFathomDynamicProgramming ()
-{
-    gutsOfDelete();
-}
-// Does deleteions
-void
-CbcFathomDynamicProgramming::gutsOfDelete()
-{
-    delete [] cost_;
-    delete [] back_;
-    delete [] lookup_;
-    delete [] indices_;
-    delete [] startBit_;
-    delete [] numberBits_;
-    delete [] rhs_;
-    delete [] coefficients_;
-    cost_ = NULL;
-    back_ = NULL;
-    lookup_ = NULL;
-    indices_ = NULL;
-    startBit_ = NULL;
-    numberBits_ = NULL;
-    rhs_ = NULL;
-    coefficients_ = NULL;
-}
-// Clone
-CbcFathom *
-CbcFathomDynamicProgramming::clone() const
-{
-    return new CbcFathomDynamicProgramming(*this);
-}
-
-// Copy constructor
-CbcFathomDynamicProgramming::CbcFathomDynamicProgramming(const CbcFathomDynamicProgramming & rhs)
-        :
-        CbcFathom(rhs),
-        size_(rhs.size_),
-        type_(rhs.type_),
-        cost_(NULL),
-        back_(NULL),
-        lookup_(NULL),
-        indices_(NULL),
-        numberActive_(rhs.numberActive_),
-        maximumSizeAllowed_(rhs.maximumSizeAllowed_),
-        startBit_(NULL),
-        numberBits_(NULL),
-        rhs_(NULL),
-        coefficients_(NULL),
-        target_(rhs.target_),
-        numberNonOne_(rhs.numberNonOne_),
-        bitPattern_(rhs.bitPattern_),
-        algorithm_(rhs.algorithm_)
-{
-    if (size_) {
-        cost_ = CoinCopyOfArray(rhs.cost_, size_);
-        back_ = CoinCopyOfArray(rhs.back_, size_);
-        int numberRows = model_->getNumRows();
-        lookup_ = CoinCopyOfArray(rhs.lookup_, numberRows);
-        startBit_ = CoinCopyOfArray(rhs.startBit_, numberActive_);
-        indices_ = CoinCopyOfArray(rhs.indices_, numberActive_);
-        numberBits_ = CoinCopyOfArray(rhs.numberBits_, numberActive_);
-        rhs_ = CoinCopyOfArray(rhs.rhs_, numberActive_);
-        coefficients_ = CoinCopyOfArray(rhs.coefficients_, numberActive_);
-    }
-}
-// Returns type
-int
-CbcFathomDynamicProgramming::checkPossible(int allowableSize)
-{
-    algorithm_ = -1;
-    assert(model_->solver());
-    OsiSolverInterface * solver = model_->solver();
-    const CoinPackedMatrix * matrix = solver->getMatrixByCol();
-
-    int numberIntegers = model_->numberIntegers();
-    int numberColumns = solver->getNumCols();
-    size_ = 0;
-    if (numberIntegers != numberColumns)
-        return -1; // can't do dynamic programming
-
-    const double * lower = solver->getColLower();
-    const double * upper = solver->getColUpper();
-    const double * rowUpper = solver->getRowUpper();
-
-    int numberRows = model_->getNumRows();
-    int i;
-
-    // First check columns to see if possible
-    double * rhs = new double [numberRows];
-    CoinCopyN(rowUpper, numberRows, rhs);
-
-    // Column copy
-    const double * element = matrix->getElements();
-    const int * row = matrix->getIndices();
-    const CoinBigIndex * columnStart = matrix->getVectorStarts();
-    const int * columnLength = matrix->getVectorLengths();
-    bool bad = false;
-    /* It is just possible that we could say okay as
-       variables may get fixed but seems unlikely */
-    for (i = 0; i < numberColumns; i++) {
-        int j;
-        double lowerValue = lower[i];
-        assert (lowerValue == floor(lowerValue));
-        for (j = columnStart[i];
-                j < columnStart[i] + columnLength[i]; j++) {
-            int iRow = row[j];
-            double value = element[j];
-            if (upper[i] > lowerValue && (value <= 0.0 || value != floor(value)))
-                bad = true;
-            if (lowerValue)
-                rhs[iRow] -= lowerValue * value;
-        }
-    }
-    // check possible (at present do not allow covering)
-    int numberActive = 0;
-    bool infeasible = false;
-    bool saveBad = bad;
-    for (i = 0; i < numberRows; i++) {
-        if (rhs[i] < 0)
-            infeasible = true;
-        else if (rhs[i] > 1.0e5 || fabs(rhs[i] - floor(rhs[i] + 0.5)) > 1.0e-7)
-            bad = true;
-        else if (rhs[i] > 0.0)
-            numberActive++;
-    }
-    if (bad || infeasible) {
-        delete [] rhs;
-        if (!saveBad && infeasible)
-            return -2;
-        else
-            return -1;
-    }
-    // check size of array needed
-    double size = 1.0;
-    double check = COIN_INT_MAX;
-    for (i = 0; i < numberRows; i++) {
-        int n = static_cast<int> (floor(rhs[i] + 0.5));
-        if (n) {
-            n++; // allow for 0,1... n
-            if (numberActive != 1) {
-                // power of 2
-                int iBit = 0;
-                int k = n;
-                k &= ~1;
-                while (k) {
-                    iBit++;
-                    k &= ~(1 << iBit);
-                }
-                // See if exact power
-                if (n != (1 << iBit)) {
-                    // round up to next power of 2
-                    n = 1 << (iBit + 1);
-                }
-                size *= n;
-                if (size >= check)
-                    break;
-            } else {
-                size = n; // just one constraint
-            }
-        }
-    }
-    // set size needed
-    if (size >= check)
-        size_ = COIN_INT_MAX;
-    else
-        size_ = static_cast<int> (size);
-
-    int n01 = 0;
-    int nbadcoeff = 0;
-    // See if we can tighten bounds
-    for (i = 0; i < numberColumns; i++) {
-        int j;
-        double lowerValue = lower[i];
-        double gap = upper[i] - lowerValue;
-        for (j = columnStart[i];
-                j < columnStart[i] + columnLength[i]; j++) {
-            int iRow = row[j];
-            double value = element[j];
-            if (value != 1.0)
-                nbadcoeff++;
-            if (gap*value > rhs[iRow] + 1.0e-8)
-                gap = rhs[iRow] / value;
-        }
-        gap = lowerValue + floor(gap + 1.0e-7);
-        if (gap < upper[i])
-            solver->setColUpper(i, gap);
-        if (gap <= 1.0)
-            n01++;
-    }
-    if (allowableSize && size_ <= allowableSize) {
-        if (n01 == numberColumns && !nbadcoeff)
-            algorithm_ = 0; // easiest
-        else
-            algorithm_ = 1;
-    }
-    if (allowableSize && size_ <= allowableSize) {
-        numberActive_ = numberActive;
-        indices_ = new int [numberActive_];
-        cost_ = new double [size_];
-        CoinFillN(cost_, size_, COIN_DBL_MAX);
-        // but do nothing is okay
-        cost_[0] = 0.0;
-        back_ = new int[size_];
-        CoinFillN(back_, size_, -1);
-        startBit_ = new int[numberActive_];
-        numberBits_ = new int[numberActive_];
-        lookup_ = new int [numberRows];
-        rhs_ = new int [numberActive_];
-        numberActive = 0;
-        int kBit = 0;
-        for (i = 0; i < numberRows; i++) {
-            int n = static_cast<int> (floor(rhs[i] + 0.5));
-            if (n) {
-                lookup_[i] = numberActive;
-                rhs_[numberActive] = n;
-                startBit_[numberActive] = kBit;
-                n++; // allow for 0,1... n
-                int iBit = 0;
-                // power of 2
-                int k = n;
-                k &= ~1;
-                while (k) {
-                    iBit++;
-                    k &= ~(1 << iBit);
-                }
-                // See if exact power
-                if (n != (1 << iBit)) {
-                    // round up to next power of 2
-                    iBit++;
-                }
-                if (numberActive != 1) {
-                    n = 1 << iBit;
-                    size *= n;
-                    if (size >= check)
-                        break;
-                } else {
-                    size = n; // just one constraint
-                }
-                numberBits_[numberActive++] = iBit;
-                kBit += iBit;
-            } else {
-                lookup_[i] = -1;
-            }
-        }
-        const double * rowLower = solver->getRowLower();
-        if (algorithm_ == 0) {
-            // rhs 1 and coefficients 1
-            // Get first possible solution for printing
-            target_ = -1;
-            int needed = 0;
-            int numberActive = 0;
-            for (i = 0; i < numberRows; i++) {
-                int newRow = lookup_[i];
-                if (newRow >= 0) {
-                    if (rowLower[i] == rowUpper[i]) {
-                        needed += 1 << numberActive;
-                        numberActive++;
-                    }
-                }
-            }
-            for (i = 0; i < size_; i++) {
-                if ((i&needed) == needed) {
-                    break;
-                }
-            }
-            target_ = i;
-        } else {
-            coefficients_ = new int[numberActive_];
-            // If not too many general rhs then we can be more efficient
-            numberNonOne_ = 0;
-            for (i = 0; i < numberActive_; i++) {
-                if (rhs_[i] != 1)
-                    numberNonOne_++;
-            }
-            if (numberNonOne_*2 < numberActive_) {
-                // put rhs >1 every second
-                int * permute = new int[numberActive_];
-                int * temp = new int[numberActive_];
-                // try different ways
-                int k = 0;
-                for (i = 0; i < numberRows; i++) {
-                    int newRow = lookup_[i];
-                    if (newRow >= 0 && rhs_[newRow] > 1) {
-                        permute[newRow] = k;
-                        k += 2;
-                    }
-                }
-                // adjust so k points to last
-                k -= 2;
-                // and now rest
-                int k1 = 1;
-                for (i = 0; i < numberRows; i++) {
-                    int newRow = lookup_[i];
-                    if (newRow >= 0 && rhs_[newRow] == 1) {
-                        permute[newRow] = k1;
-                        k1++;
-                        if (k1 <= k)
-                            k1++;
-                    }
-                }
-                for (i = 0; i < numberActive_; i++) {
-                    int put = permute[i];
-                    temp[put] = rhs_[i];
-                }
-                memcpy(rhs_, temp, numberActive_*sizeof(int));
-                for (i = 0; i < numberActive_; i++) {
-                    int put = permute[i];
-                    temp[put] = numberBits_[i];
-                }
-                memcpy(numberBits_, temp, numberActive_*sizeof(int));
-                k = 0;
-                for (i = 0; i < numberActive_; i++) {
-                    startBit_[i] = k;
-                    k += numberBits_[i];
-                }
-                for (i = 0; i < numberRows; i++) {
-                    int newRow = lookup_[i];
-                    if (newRow >= 0)
-                        lookup_[i] = permute[newRow];
-                }
-                delete [] permute;
-                delete [] temp;
-                // mark new method
-                algorithm_ = 2;
-            }
-            // Get first possible solution for printing
-            target_ = -1;
-            int needed = 0;
-            int * lower2 = new int[numberActive_];
-            for (i = 0; i < numberRows; i++) {
-                int newRow = lookup_[i];
-                if (newRow >= 0) {
-                    int gap = static_cast<int> (rowUpper[i] - CoinMax(0.0, rowLower[i]));
-                    lower2[newRow] = rhs_[newRow] - gap;
-                    int numberBits = numberBits_[newRow];
-                    int startBit = startBit_[newRow];
-                    if (numberBits == 1 && !gap) {
-                        needed |= 1 << startBit;
-                    }
-                }
-            }
-            for (i = 0; i < size_; i++) {
-                if ((i&needed) == needed) {
-                    // this one may do
-                    bool good = true;
-                    for (int kk = 0; kk < numberActive_; kk++) {
-                        int numberBits = numberBits_[kk];
-                        int startBit = startBit_[kk];
-                        int size = 1 << numberBits;
-                        int start = 1 << startBit;
-                        int mask = start * (size - 1);
-                        int level = (i & mask) >> startBit;
-                        if (level < lower2[kk]) {
-                            good = false;
-                            break;
-                        }
-                    }
-                    if (good) {
-                        break;
-                    }
-                }
-            }
-            delete [] lower2;
-            target_ = i;
-        }
-    }
-    delete [] rhs;
-    if (allowableSize && size_ > allowableSize) {
-      COIN_DETAIL_PRINT(printf("Too large - need %d entries x 8 bytes\n", size_));
-        return -1; // too big
-    } else {
-        return algorithm_;
-    }
-}
-
-// Resets stuff if model changes
-void
-CbcFathomDynamicProgramming::resetModel(CbcModel * model)
-{
-    model_ = model;
-    type_ = checkPossible();
-}
-int
-CbcFathomDynamicProgramming::fathom(double * & betterSolution)
-{
-    int returnCode = 0;
-    int type = checkPossible(maximumSizeAllowed_);
-    assert (type != -1);
-    if (type == -2) {
-        // infeasible (so complete search done)
-        return 1;
-    }
-    if (algorithm_ >= 0) {
-        OsiSolverInterface * solver = model_->solver();
-        const double * lower = solver->getColLower();
-        const double * upper = solver->getColUpper();
-        const double * objective = solver->getObjCoefficients();
-        double direction = solver->getObjSense();
-        const CoinPackedMatrix * matrix = solver->getMatrixByCol();
-        // Column copy
-        const double * element = matrix->getElements();
-        const int * row = matrix->getIndices();
-        const CoinBigIndex * columnStart = matrix->getVectorStarts();
-        const int * columnLength = matrix->getVectorLengths();
-        const double * rowLower = solver->getRowLower();
-        const double * rowUpper = solver->getRowUpper();
-        int numberRows = model_->getNumRows();
-
-        int numberColumns = solver->getNumCols();
-        double offset;
-        solver->getDblParam(OsiObjOffset, offset);
-        double fixedObj = -offset;
-        int i;
-        // may be possible
-        double bestAtTarget = COIN_DBL_MAX;
-        for (i = 0; i < numberColumns; i++) {
-            if (size_ > 10000000 && (i % 100) == 0)
-	      COIN_DETAIL_PRINT(printf("column %d\n", i));
-            double lowerValue = lower[i];
-            assert (lowerValue == floor(lowerValue));
-            double cost = direction * objective[i];
-            fixedObj += lowerValue * cost;
-            int gap = static_cast<int> (upper[i] - lowerValue);
-            CoinBigIndex start = columnStart[i];
-            tryColumn(columnLength[i], row + start, element + start, cost, gap);
-            if (cost_[target_] < bestAtTarget) {
-                if (model_->messageHandler()->logLevel() > 1)
-                    printf("At column %d new best objective of %g\n", i, cost_[target_]);
-                bestAtTarget = cost_[target_];
-            }
-        }
-        returnCode = 1;
-        int needed = 0;
-        double bestValue = COIN_DBL_MAX;
-        int iBest = -1;
-        if (algorithm_ == 0) {
-            int numberActive = 0;
-            for (i = 0; i < numberRows; i++) {
-                int newRow = lookup_[i];
-                if (newRow >= 0) {
-                    if (rowLower[i] == rowUpper[i]) {
-                        needed += 1 << numberActive;
-                        numberActive++;
-                    }
-                }
-            }
-            for (i = 0; i < size_; i++) {
-                if ((i&needed) == needed) {
-                    // this one will do
-                    if (cost_[i] < bestValue) {
-                        bestValue = cost_[i];
-                        iBest = i;
-                    }
-                }
-            }
-        } else {
-            int * lower = new int[numberActive_];
-            for (i = 0; i < numberRows; i++) {
-                int newRow = lookup_[i];
-                if (newRow >= 0) {
-                    int gap = static_cast<int> (rowUpper[i] - CoinMax(0.0, rowLower[i]));
-                    lower[newRow] = rhs_[newRow] - gap;
-                    int numberBits = numberBits_[newRow];
-                    int startBit = startBit_[newRow];
-                    if (numberBits == 1 && !gap) {
-                        needed |= 1 << startBit;
-                    }
-                }
-            }
-            for (i = 0; i < size_; i++) {
-                if ((i&needed) == needed) {
-                    // this one may do
-                    bool good = true;
-                    for (int kk = 0; kk < numberActive_; kk++) {
-                        int numberBits = numberBits_[kk];
-                        int startBit = startBit_[kk];
-                        int size = 1 << numberBits;
-                        int start = 1 << startBit;
-                        int mask = start * (size - 1);
-                        int level = (i & mask) >> startBit;
-                        if (level < lower[kk]) {
-                            good = false;
-                            break;
-                        }
-                    }
-                    if (good && cost_[i] < bestValue) {
-                        bestValue = cost_[i];
-                        iBest = i;
-                    }
-                }
-            }
-            delete [] lower;
-        }
-        if (bestValue < COIN_DBL_MAX) {
-            bestValue += fixedObj;
-            if (model_->messageHandler()->logLevel() > 1)
-                printf("Can get solution of %g\n", bestValue);
-            if (bestValue < model_->getMinimizationObjValue()) {
-                // set up solution
-                betterSolution = new double[numberColumns];
-                memcpy(betterSolution, lower, numberColumns*sizeof(double));
-                while (iBest > 0) {
-                    int n = decodeBitPattern(iBest - back_[iBest], indices_, numberRows);
-                    // Search for cheapest
-                    double bestCost = COIN_DBL_MAX;
-                    int iColumn = -1;
-                    for (i = 0; i < numberColumns; i++) {
-                        if (n == columnLength[i]) {
-                            bool good = true;
-                            for (int j = columnStart[i];
-                                    j < columnStart[i] + columnLength[i]; j++) {
-                                int iRow = row[j];
-                                double value = element[j];
-                                int iValue = static_cast<int> (value);
-                                if (iValue != indices_[iRow]) {
-                                    good = false;
-                                    break;
-                                }
-                            }
-                            if (good && objective[i] < bestCost && betterSolution[i] < upper[i]) {
-                                bestCost = objective[i];
-                                iColumn = i;
-                            }
-                        }
-                    }
-                    assert (iColumn >= 0);
-                    betterSolution[iColumn]++;
-                    assert (betterSolution[iColumn] <= upper[iColumn]);
-                    iBest = back_[iBest];
-                }
-            }
-            // paranoid check
-            double * rowActivity = new double [numberRows];
-            memset(rowActivity, 0, numberRows*sizeof(double));
-            for (i = 0; i < numberColumns; i++) {
-                int j;
-                double value = betterSolution[i];
-                if (value) {
-                    for (j = columnStart[i];
-                            j < columnStart[i] + columnLength[i]; j++) {
-                        int iRow = row[j];
-                        rowActivity[iRow] += value * element[j];
-                    }
-                }
-            }
-            // check was feasible
-            bool feasible = true;
-            for (i = 0; i < numberRows; i++) {
-                if (rowActivity[i] < rowLower[i]) {
-                    if (rowActivity[i] < rowLower[i] - 1.0e-8)
-                        feasible = false;
-                } else if (rowActivity[i] > rowUpper[i]) {
-                    if (rowActivity[i] > rowUpper[i] + 1.0e-8)
-                        feasible = false;
-                }
-            }
-            if (feasible) {
-                if (model_->messageHandler()->logLevel() > 0)
-                    printf("** good solution of %g by dynamic programming\n", bestValue);
-            }
-            delete [] rowActivity;
-        }
-        gutsOfDelete();
-    }
-    return returnCode;
-}
-/* Tries a column
-   returns true if was used in making any changes.
-*/
-bool
-CbcFathomDynamicProgramming::tryColumn(int numberElements, const int * rows,
-                                       const double * coefficients, double cost,
-                                       int upper)
-{
-    bool touched = false;
-    int n = 0;
-    if (algorithm_ == 0) {
-        for (int j = 0; j < numberElements; j++) {
-            int iRow = rows[j];
-            double value = coefficients[j];
-            int newRow = lookup_[iRow];
-            if (newRow < 0 || value > rhs_[newRow]) {
-                n = 0;
-                break; //can't use
-            } else {
-                indices_[n++] = newRow;
-            }
-        }
-        if (n && upper) {
-            touched = addOneColumn0(n, indices_, cost);
-        }
-    } else {
-        for (int j = 0; j < numberElements; j++) {
-            int iRow = rows[j];
-            double value = coefficients[j];
-            int iValue = static_cast<int> (value);
-            int newRow = lookup_[iRow];
-            if (newRow < 0 || iValue > rhs_[newRow]) {
-                n = 0;
-                break; //can't use
-            } else {
-                coefficients_[n] = iValue;
-                indices_[n++] = newRow;
-                if (upper*iValue > rhs_[newRow]) {
-                    upper = rhs_[newRow] / iValue;
-                }
-            }
-        }
-        if (n) {
-            if (algorithm_ == 1) {
-                for (int k = 1; k <= upper; k++) {
-                    bool t = addOneColumn1(n, indices_, coefficients_, cost);
-                    if (t)
-                        touched = true;
-                }
-            } else {
-                CoinSort_2(indices_, indices_ + n, coefficients_);
-                for (int k = 1; k <= upper; k++) {
-                    bool t = addOneColumn1A(n, indices_, coefficients_, cost);
-                    if (t)
-                        touched = true;
-                }
-            }
-        }
-    }
-    return touched;
-}
-/* Adds one column if type 0,
-   returns true if was used in making any changes
-*/
-bool
-CbcFathomDynamicProgramming::addOneColumn0(int numberElements, const int * rows,
-        double cost)
-{
-    // build up mask
-    int mask = 0;
-    int i;
-    for (i = 0; i < numberElements; i++) {
-        int iRow = rows[i];
-        mask |= 1 << iRow;
-    }
-    bitPattern_ = mask;
-    i = size_ - 1 - mask;
-    bool touched = false;
-    while (i >= 0) {
-        int kMask = i & mask;
-        if (kMask == 0) {
-            double thisCost = cost_[i];
-            if (thisCost != COIN_DBL_MAX) {
-                // possible
-                double newCost = thisCost + cost;
-                int next = i + mask;
-                if (cost_[next] > newCost) {
-                    cost_[next] = newCost;
-                    back_[next] = i;
-                    touched = true;
-                }
-            }
-            i--;
-        } else {
-            // we can skip some
-            int k = (i&~mask);
-#ifdef CBC_DEBUG
-            for (int j = i - 1; j > k; j--) {
-                int jMask = j & mask;
-                assert (jMask != 0);
-            }
-#endif
-            i = k;
-        }
-    }
-    return touched;
-}
-/* Adds one attempt of one column of type 1,
-   returns true if was used in making any changes.
-   At present the user has to call it once for each possible value
-*/
-bool
-CbcFathomDynamicProgramming::addOneColumn1(int numberElements, const int * rows,
-        const int * coefficients, double cost)
-{
-    /* build up masks.
-       a) mask for 1 rhs
-       b) mask for addition
-       c) mask so adding will overflow
-       d) individual masks
-    */
-    int mask1 = 0;
-    int maskAdd = 0;
-    int mask2 = 0;
-    int i;
-    int n2 = 0;
-    int mask[40];
-    int adjust[40];
-    assert (numberElements <= 40);
-    for (i = 0; i < numberElements; i++) {
-        int iRow = rows[i];
-        int numberBits = numberBits_[iRow];
-        int startBit = startBit_[iRow];
-        if (numberBits == 1) {
-            mask1 |= 1 << startBit;
-            maskAdd |= 1 << startBit;
-            mask2 |= 1 << startBit;
-        } else {
-            int value = coefficients[i];
-            int size = 1 << numberBits;
-            int start = 1 << startBit;
-            assert (value < size);
-            maskAdd |= start * value;
-            int gap = size - rhs_[iRow] - 1;
-            assert (gap >= 0);
-            int hi2 = rhs_[iRow] - value;
-            if (hi2 < size - 1)
-                hi2++;
-            adjust[n2] = start * hi2;
-            mask2 += start * gap;
-            mask[n2++] = start * (size - 1);
-        }
-    }
-    bitPattern_ = maskAdd;
-    i = size_ - 1 - maskAdd;
-    bool touched = false;
-    while (i >= 0) {
-        int kMask = i & mask1;
-        if (kMask == 0) {
-            bool good = true;
-            for (int kk = n2 - 1; kk >= 0; kk--) {
-                int iMask = mask[kk];
-                int jMask = iMask & mask2;
-                int kkMask = iMask & i;
-                kkMask += jMask;
-                if (kkMask > iMask) {
-                    // we can skip some
-                    int k = (i&~iMask);
-                    k |= adjust[kk];
-#ifdef CBC_DEBUG
-                    for (int j = i - 1; j > k; j--) {
-                        int jMask = j & mask1;
-                        if (jMask == 0) {
-                            bool good = true;
-                            for (int kk = n2 - 1; kk >= 0; kk--) {
-                                int iMask = mask[kk];
-                                int jMask = iMask & mask2;
-                                int kkMask = iMask & i;
-                                kkMask += jMask;
-                                if (kkMask > iMask) {
-                                    good = false;
-                                    break;
-                                }
-                            }
-                            assert (!good);
-                        }
-                    }
-#endif
-                    i = k;
-                    good = false;
-                    break;
-                }
-            }
-            if (good) {
-                double thisCost = cost_[i];
-                if (thisCost != COIN_DBL_MAX) {
-                    // possible
-                    double newCost = thisCost + cost;
-                    int next = i + maskAdd;
-                    if (cost_[next] > newCost) {
-                        cost_[next] = newCost;
-                        back_[next] = i;
-                        touched = true;
-                    }
-                }
-            }
-            i--;
-        } else {
-            // we can skip some
-            // we can skip some
-            int k = (i&~mask1);
-#ifdef CBC_DEBUG
-            for (int j = i - 1; j > k; j--) {
-                int jMask = j & mask1;
-                assert (jMask != 0);
-            }
-#endif
-            i = k;
-        }
-    }
-    return touched;
-}
-/* Adds one attempt of one column of type 1,
-   returns true if was used in making any changes.
-   At present the user has to call it once for each possible value
-   This version is when there are enough 1 rhs to do faster
-*/
-bool
-CbcFathomDynamicProgramming::addOneColumn1A(int numberElements, const int * rows,
-        const int * coefficients, double cost)
-{
-    /* build up masks.
-       a) mask for 1 rhs
-       b) mask for addition
-       c) mask so adding will overflow
-       d) mask for non 1 rhs
-    */
-    int maskA = 0;
-    int maskAdd = 0;
-    int maskC = 0;
-    int maskD = 0;
-    int i;
-    for (i = 0; i < numberElements; i++) {
-        int iRow = rows[i];
-        int numberBits = numberBits_[iRow];
-        int startBit = startBit_[iRow];
-        if (numberBits == 1) {
-            maskA |= 1 << startBit;
-            maskAdd |= 1 << startBit;
-        } else {
-            int value = coefficients[i];
-            int size = 1 << numberBits;
-            int start = 1 << startBit;
-            assert (value < size);
-            maskAdd |= start * value;
-            int gap = size - rhs_[iRow] + value - 1;
-            assert (gap > 0 && gap <= size - 1);
-            maskC |= start * gap;
-            maskD |= start * (size - 1);
-        }
-    }
-    bitPattern_ = maskAdd;
-    int maskDiff = maskD - maskC;
-    i = size_ - 1 - maskAdd;
-    bool touched = false;
-    if (!maskD) {
-        // Just ones
-        while (i >= 0) {
-            int kMask = i & maskA;
-            if (kMask == 0) {
-                double thisCost = cost_[i];
-                if (thisCost != COIN_DBL_MAX) {
-                    // possible
-                    double newCost = thisCost + cost;
-                    int next = i + maskAdd;
-                    if (cost_[next] > newCost) {
-                        cost_[next] = newCost;
-                        back_[next] = i;
-                        touched = true;
-                    }
-                }
-                i--;
-            } else {
-                // we can skip some
-                int k = (i&~maskA);
-                i = k;
-            }
-        }
-    } else {
-        // More general
-        while (i >= 0) {
-            int kMask = i & maskA;
-            if (kMask == 0) {
-                int added = i & maskD; // just bits belonging to non 1 rhs
-                added += maskC; // will overflow mask if bad
-                added &= (~maskD);
-                if (added == 0) {
-                    double thisCost = cost_[i];
-                    if (thisCost != COIN_DBL_MAX) {
-                        // possible
-                        double newCost = thisCost + cost;
-                        int next = i + maskAdd;
-                        if (cost_[next] > newCost) {
-                            cost_[next] = newCost;
-                            back_[next] = i;
-                            touched = true;
-                        }
-                    }
-                    i--;
-                } else {
-                    // we can skip some
-                    int k = i & ~ maskD; // clear all
-                    // Put back enough - but only below where we are
-                    int kk = (numberNonOne_ << 1) - 2;
-                    assert (rhs_[kk] > 1);
-                    int iMask = 0;
-                    for (; kk >= 0; kk -= 2) {
-                        iMask = 1 << startBit_[kk+1];
-                        if ((added&iMask) != 0) {
-                            iMask--;
-                            break;
-                        }
-                    }
-                    assert (kk >= 0);
-                    iMask &= maskDiff;
-                    k |= iMask;
-                    assert (k < i);
-                    i = k;
-                }
-            } else {
-                // we can skip some
-                int k = (i&~maskA);
-                i = k;
-            }
-        }
-    }
-    return touched;
-}
-// update model
-void CbcFathomDynamicProgramming::setModel(CbcModel * model)
-{
-    model_ = model;
-    type_ = checkPossible();
-}
-// Gets bit pattern from original column
-int CbcFathomDynamicProgramming::bitPattern(int numberElements, const int * rows,
-        const int * coefficients)
-{
-    int i;
-    int mask = 0;
-    switch (algorithm_) {
-        // just ones
-    case 0:
-        for (i = 0; i < numberElements; i++) {
-            int iRow = rows[i];
-            iRow = lookup_[iRow];
-            if (iRow >= 0)
-                mask |= 1 << iRow;
-        }
-        break;
-        //
-    case 1:
-    case 2:
-        for (i = 0; i < numberElements; i++) {
-            int iRow = rows[i];
-            iRow = lookup_[iRow];
-            if (iRow >= 0) {
-                int startBit = startBit_[iRow];
-                int value = coefficients[i];
-                int start = 1 << startBit;
-                mask |= start * value;
-            }
-        }
-        break;
-    }
-    return mask;
-}
-// Fills in original column (dense) from bit pattern
-int CbcFathomDynamicProgramming::decodeBitPattern(int bitPattern,
-        int * values,
-        int numberRows)
-{
-    int i;
-    int n = 0;
-    switch (algorithm_) {
-        // just ones
-    case 0:
-        for (i = 0; i < numberRows; i++) {
-            values[i] = 0;
-            int iRow = lookup_[i];
-            if (iRow >= 0) {
-                if ((bitPattern&(1 << iRow)) != 0) {
-                    values[i] = 1;
-                    n++;
-                }
-            }
-        }
-        break;
-        //
-    case 1:
-    case 2:
-        for (i = 0; i < numberRows; i++) {
-            values[i] = 0;
-            int iRow = lookup_[i];
-            if (iRow >= 0) {
-                int startBit = startBit_[iRow];
-                int numberBits = numberBits_[iRow];
-                int iValue = bitPattern >> startBit;
-                iValue &= ((1 << numberBits) - 1);
-                if (iValue) {
-                    values[i] = iValue;
-                    n++;
-                }
-            }
-        }
-        break;
-    }
-    return n;
-}
-
-
diff --git a/cbits/coin/CbcLinkedUtils.cpp b/cbits/coin/CbcLinkedUtils.cpp
deleted file mode 100644
--- a/cbits/coin/CbcLinkedUtils.cpp
+++ /dev/null
@@ -1,832 +0,0 @@
-// Copyright (C) 2007, International Business Machines
-// Corporation and others.  All Rights Reserved.
-// This code is licensed under the terms of the Eclipse Public License (EPL).
-
-/* $Id: CbcLinkedUtils.cpp 1902 2013-04-10 16:58:16Z stefan $ */
-
-/*! \file CbcAugmentClpSimplex.cpp
-    \brief Hooks to Ampl (for CbcLinked)
-
-    This code is a condensation of ClpAmplStuff.cpp, renamed to better
-    reflect its current place in cbc.
-
-  The code here had ties to NEW_STYLE_SOLVER code. During the 091209 Watson
-  meeting, NEW_STYLE_SOLVER code was eliminated. The code here was condensed
-  from ClpAmplStuff.cpp. The hook into CbcLinked is loadNonLinear. Once you
-  bring that in, all the rest follows. Still, we're down about 400 lines of
-  code. In the process, it appears that ClpAmplObjective.cpp was never needed
-  here; the code was hooked into ClpAmplStuff.cpp.  --lh, 091209 --
-*/
-
-#include "ClpConfig.h"
-#include "CbcConfig.h"
-#ifdef COIN_HAS_ASL
-#include "CoinPragma.hpp"
-#include "CoinHelperFunctions.hpp"
-#include "CoinIndexedVector.hpp"
-#include "ClpFactorization.hpp"
-#include "ClpSimplex.hpp"
-#include "ClpAmplObjective.hpp"
-#include "ClpConstraintAmpl.hpp"
-#include "ClpMessage.hpp"
-#include "CoinUtilsConfig.h"
-#include "CoinHelperFunctions.hpp"
-#include "CoinWarmStartBasis.hpp"
-#include "OsiSolverInterface.hpp"
-#include "Cbc_ampl.h"
-#include "CoinTime.hpp"
-#include "CglStored.hpp"
-#include "CoinModel.hpp"
-#include "CbcLinked.hpp"
-
-extern "C" {
-    //# include "getstub.h"
-# include "asl_pfgh.h"
-}
-
-// stolen from IPopt with changes
-typedef struct {
-    double obj_sign_;
-    ASL_pfgh * asl_;
-    double * non_const_x_;
-    int * column_; // for jacobian
-    int * rowStart_;
-    double * gradient_;
-    double * constraintValues_;
-    int nz_h_full_; // number of nonzeros in hessian
-    int nerror_;
-    bool objval_called_with_current_x_;
-    bool conval_called_with_current_x_;
-    bool jacval_called_with_current_x_;
-} CbcAmplInfo;
-
-//#############################################################################
-// Constructors / Destructor / Assignment
-//#############################################################################
-
-//-------------------------------------------------------------------
-// Default Constructor
-//-------------------------------------------------------------------
-ClpAmplObjective::ClpAmplObjective ()
-        : ClpObjective()
-{
-    type_ = 12;
-    objective_ = NULL;
-    amplObjective_ = NULL;
-    gradient_ = NULL;
-    offset_ = 0.0;
-}
-
-bool get_constraints_linearity(void * amplInfo, int  n,
-                               int * const_types)
-{
-    CbcAmplInfo * info = (CbcAmplInfo *) amplInfo;
-    ASL_pfgh* asl = info->asl_;
-    //check that n is good
-    assert(n == n_con);
-    // check that there are no network constraints
-    assert(nlnc == 0 && lnc == 0);
-    //the first nlc constraints are non linear the rest is linear
-    int i;
-    for (i = 0; i < nlc; i++) {
-        const_types[i] = 1;
-    }
-    // the rest is linear
-    for (i = nlc; i < n_con; i++)
-        const_types[i] = 0;
-    return true;
-}
-static bool internal_objval(CbcAmplInfo * info , double & obj_val)
-{
-    ASL_pfgh* asl = info->asl_;
-    info->objval_called_with_current_x_ = false; // in case the call below fails
-
-    if (n_obj == 0) {
-        obj_val = 0;
-        info->objval_called_with_current_x_ = true;
-        return true;
-    }  else {
-        double  retval = objval(0, info->non_const_x_, (fint*)&info->nerror_);
-        if (!info->nerror_) {
-            obj_val = info->obj_sign_ * retval;
-            info->objval_called_with_current_x_ = true;
-            return true;
-        } else {
-            abort();
-        }
-    }
-
-    return false;
-}
-
-static bool internal_conval(CbcAmplInfo * info , double * g)
-{
-    ASL_pfgh* asl = info->asl_;
-    info->conval_called_with_current_x_ = false; // in case the call below fails
-    assert (g);
-
-    conval(info->non_const_x_, g, (fint*)&info->nerror_);
-
-    if (!info->nerror_) {
-        info->conval_called_with_current_x_ = true;
-        return true;
-    } else {
-        abort();
-    }
-    return false;
-}
-
-static bool apply_new_x(CbcAmplInfo * info  , bool new_x, int  n, const double * x)
-{
-    ASL_pfgh* asl = info->asl_;
-
-    if (new_x) {
-        // update the flags so these methods are called
-        // before evaluating the hessian
-        info->conval_called_with_current_x_ = false;
-        info->objval_called_with_current_x_ = false;
-        info->jacval_called_with_current_x_ = false;
-
-        //copy the data to the non_const_x_
-        if (!info->non_const_x_) {
-            info->non_const_x_ = new double [n];
-        }
-
-        for (int  i = 0; i < n; i++) {
-            info->non_const_x_[i] = x[i];
-        }
-
-        // tell ampl that we have a new x
-        xknowne(info->non_const_x_, (fint*)&info->nerror_);
-        return info->nerror_ ? false : true;
-    }
-
-    return true;
-}
-
-static bool eval_f(void * amplInfo, int  n, const double * x, bool new_x, double & obj_value)
-{
-    CbcAmplInfo * info = (CbcAmplInfo *) amplInfo;
-    if (!apply_new_x(info, new_x, n, x)) {
-        return false;
-    }
-
-    return internal_objval(info, obj_value);
-}
-
-static bool eval_grad_f(void * amplInfo, int  n, const double * x, bool new_x, double * grad_f)
-{
-    CbcAmplInfo * info = (CbcAmplInfo *) amplInfo;
-    ASL_pfgh* asl = info->asl_;
-    if (!apply_new_x(info, new_x, n, x)) {
-        return false;
-    }
-    int i;
-
-    if (n_obj == 0) {
-        for (i = 0; i < n; i++) {
-            grad_f[i] = 0.;
-        }
-    } else {
-        objgrd(0, info->non_const_x_, grad_f, (fint*)&info->nerror_);
-        if (info->nerror_) {
-            return false;
-        }
-
-        if (info->obj_sign_ == -1) {
-            for (i = 0; i < n; i++) {
-                grad_f[i] = -grad_f[i];
-            }
-        }
-    }
-    return true;
-}
-
-static bool eval_g(void * amplInfo, int  n, const double * x, bool new_x, double * g)
-{
-    CbcAmplInfo * info = (CbcAmplInfo *) amplInfo;
-#ifndef NDEBUG
-    ASL_pfgh* asl = info->asl_;
-#endif
-    // warning: n_var is a macro that assumes we have a variable called asl
-    assert(n == n_var);
-
-    if (!apply_new_x(info, new_x, n, x)) {
-        return false;
-    }
-
-    return internal_conval(info, g);
-}
-
-static bool eval_jac_g(void * amplInfo, int  n, const double * x, bool new_x,
-                       double * values)
-{
-    CbcAmplInfo * info = (CbcAmplInfo *) amplInfo;
-    ASL_pfgh* asl = info->asl_;
-    assert(n == n_var);
-
-    assert (values);
-    if (!apply_new_x(info, new_x, n, x)) {
-        return false;
-    }
-
-    jacval(info->non_const_x_, values, (fint*)&info->nerror_);
-    if (!info->nerror_) {
-        return true;
-    } else {
-        abort();
-    }
-    return false;
-}
-//-------------------------------------------------------------------
-// Useful Constructor
-//-------------------------------------------------------------------
-ClpAmplObjective::ClpAmplObjective (void * amplInfo)
-        : ClpObjective()
-{
-    type_ = 12;
-    activated_ = 1;
-    gradient_ = NULL;
-    objective_ = NULL;
-    offset_ = 0.0;
-    amplObjective_ = amplInfo;
-}
-
-//-------------------------------------------------------------------
-// Copy constructor
-//-------------------------------------------------------------------
-ClpAmplObjective::ClpAmplObjective (const ClpAmplObjective & rhs)
-        : ClpObjective(rhs)
-{
-    amplObjective_ = rhs.amplObjective_;
-    offset_ = rhs.offset_;
-    type_ = rhs.type_;
-    if (!amplObjective_) {
-        objective_ = NULL;
-        gradient_ = NULL;
-    } else {
-        CbcAmplInfo * info = (CbcAmplInfo *) amplObjective_;
-        ASL_pfgh* asl = info->asl_;
-
-        int numberColumns = n_var;;
-        if (rhs.objective_) {
-            objective_ = new double [numberColumns];
-            memcpy(objective_, rhs.objective_, numberColumns*sizeof(double));
-        } else {
-            objective_ = NULL;
-        }
-        if (rhs.gradient_) {
-            gradient_ = new double [numberColumns];
-            memcpy(gradient_, rhs.gradient_, numberColumns*sizeof(double));
-        } else {
-            gradient_ = NULL;
-        }
-    }
-}
-
-
-//-------------------------------------------------------------------
-// Destructor
-//-------------------------------------------------------------------
-ClpAmplObjective::~ClpAmplObjective ()
-{
-    delete [] objective_;
-    delete [] gradient_;
-}
-
-//----------------------------------------------------------------
-// Assignment operator
-//-------------------------------------------------------------------
-ClpAmplObjective &
-ClpAmplObjective::operator=(const ClpAmplObjective & rhs)
-{
-    if (this != &rhs) {
-        delete [] objective_;
-        delete [] gradient_;
-        amplObjective_ = rhs.amplObjective_;
-        offset_ = rhs.offset_;
-        type_ = rhs.type_;
-        if (!amplObjective_) {
-            objective_ = NULL;
-            gradient_ = NULL;
-        } else {
-            CbcAmplInfo * info = (CbcAmplInfo *) amplObjective_;
-            ASL_pfgh* asl = info->asl_;
-
-            int numberColumns = n_var;;
-            if (rhs.objective_) {
-                objective_ = new double [numberColumns];
-                memcpy(objective_, rhs.objective_, numberColumns*sizeof(double));
-            } else {
-                objective_ = NULL;
-            }
-            if (rhs.gradient_) {
-                gradient_ = new double [numberColumns];
-                memcpy(gradient_, rhs.gradient_, numberColumns*sizeof(double));
-            } else {
-                gradient_ = NULL;
-            }
-        }
-    }
-    return *this;
-}
-
-// Returns gradient
-double *
-ClpAmplObjective::gradient(const ClpSimplex * model,
-                           const double * solution, double & offset, bool refresh,
-                           int includeLinear)
-{
-    if (model)
-        assert (model->optimizationDirection() == 1.0);
-#ifndef NDEBUG
-    bool scaling = model && (model->rowScale() || model->objectiveScale() != 1.0 || model->optimizationDirection() != 1.0);
-#endif
-    const double * cost = NULL;
-    if (model)
-        cost = model->costRegion();
-    if (!cost) {
-        // not in solve
-        cost = objective_;
-#ifndef NDEBUG
-        scaling = false;
-#endif
-    }
-    assert (!scaling);
-    if (!amplObjective_ || !solution || !activated_) {
-        offset = offset_;
-        return objective_;
-    } else {
-        if (refresh || !gradient_) {
-            CbcAmplInfo * info = (CbcAmplInfo *) amplObjective_;
-            ASL_pfgh* asl = info->asl_;
-            int numberColumns = n_var;;
-
-            if (!gradient_)
-                gradient_ = new double[numberColumns];
-            assert (solution);
-            eval_grad_f(amplObjective_, numberColumns, solution, true, gradient_);
-            // Is this best way?
-            double objValue = 0.0;
-            eval_f(amplObjective_, numberColumns, solution, false, objValue);
-            double objValue2 = 0.0;
-            for (int i = 0; i < numberColumns; i++)
-                objValue2 += gradient_[i] * solution[i];
-            offset_ = objValue2 - objValue; // or other way???
-            if (model && model->optimizationDirection() != 1.0) {
-                offset *= model->optimizationDirection();
-                for (int i = 0; i < numberColumns; i++)
-                    gradient_[i] *= -1.0;
-            }
-        }
-        offset = offset_;
-        return gradient_;
-    }
-}
-
-//-------------------------------------------------------------------
-// Clone
-//-------------------------------------------------------------------
-ClpObjective * ClpAmplObjective::clone() const
-{
-    return new ClpAmplObjective(*this);
-}
-// Resize objective
-void
-ClpAmplObjective::resize(int newNumberColumns)
-{
-    CbcAmplInfo * info = (CbcAmplInfo *) amplObjective_;
-    ASL_pfgh* asl = info->asl_;
-    int numberColumns = n_var;;
-    if (numberColumns != newNumberColumns) {
-        abort();
-    }
-
-}
-// Delete columns in  objective
-void
-ClpAmplObjective::deleteSome(int numberToDelete, const int * which)
-{
-    if (numberToDelete)
-        abort();
-}
-/* Returns reduced gradient.Returns an offset (to be added to current one).
- */
-double
-ClpAmplObjective::reducedGradient(ClpSimplex * model, double * region,
-                                  bool useFeasibleCosts)
-{
-    int numberRows = model->numberRows();
-    int numberColumns = model->numberColumns();
-
-    //work space
-    CoinIndexedVector  * workSpace = model->rowArray(0);
-
-    CoinIndexedVector arrayVector;
-    arrayVector.reserve(numberRows + 1);
-
-    int iRow;
-#ifdef CLP_DEBUG
-    workSpace->checkClear();
-#endif
-    double * array = arrayVector.denseVector();
-    int * index = arrayVector.getIndices();
-    int number = 0;
-    const double * costNow = gradient(model, model->solutionRegion(), offset_,
-                                      true, useFeasibleCosts ? 2 : 1);
-    double * cost = model->costRegion();
-    const int * pivotVariable = model->pivotVariable();
-    for (iRow = 0; iRow < numberRows; iRow++) {
-        int iPivot = pivotVariable[iRow];
-        double value;
-        if (iPivot < numberColumns)
-            value = costNow[iPivot];
-        else if (!useFeasibleCosts)
-            value = cost[iPivot];
-        else
-            value = 0.0;
-        if (value) {
-            array[iRow] = value;
-            index[number++] = iRow;
-        }
-    }
-    arrayVector.setNumElements(number);
-
-    // Btran basic costs
-    model->factorization()->updateColumnTranspose(workSpace, &arrayVector);
-    double * work = workSpace->denseVector();
-    ClpFillN(work, numberRows, 0.0);
-    // now look at dual solution
-    double * rowReducedCost = region + numberColumns;
-    double * dual = rowReducedCost;
-    const double * rowCost = cost + numberColumns;
-    for (iRow = 0; iRow < numberRows; iRow++) {
-        dual[iRow] = array[iRow];
-    }
-    double * dj = region;
-    ClpDisjointCopyN(costNow, numberColumns, dj);
-
-    model->transposeTimes(-1.0, dual, dj);
-    for (iRow = 0; iRow < numberRows; iRow++) {
-        // slack
-        double value = dual[iRow];
-        value += rowCost[iRow];
-        rowReducedCost[iRow] = value;
-    }
-    return offset_;
-}
-/* Returns step length which gives minimum of objective for
-   solution + theta * change vector up to maximum theta.
-
-   arrays are numberColumns+numberRows
-*/
-double
-ClpAmplObjective::stepLength(ClpSimplex * model,
-                             const double * solution,
-                             const double * change,
-                             double maximumTheta,
-                             double & currentObj,
-                             double & predictedObj,
-                             double & thetaObj)
-{
-    // Assume convex
-    CbcAmplInfo * info = (CbcAmplInfo *) amplObjective_;
-    ASL_pfgh* asl = info->asl_;
-
-    int numberColumns = n_var;;
-    double * tempSolution = new double [numberColumns];
-    double * tempGradient = new double [numberColumns];
-    // current
-    eval_f(amplObjective_, numberColumns, solution, true, currentObj);
-    double objA = currentObj;
-    double thetaA = 0.0;
-    // at maximum
-    int i;
-    for (i = 0; i < numberColumns; i++)
-        tempSolution[i] = solution[i] + maximumTheta * change[i];
-    eval_f(amplObjective_, numberColumns, tempSolution, true, thetaObj);
-    double objC = thetaObj;
-    double thetaC = maximumTheta;
-    double objB = 0.5 * (objA + objC);
-    double thetaB = 0.5 * maximumTheta;
-    double gradientNorm = 1.0e6;
-    while (gradientNorm > 1.0e-6 && thetaC - thetaA > 1.0e-8) {
-        for (i = 0; i < numberColumns; i++)
-            tempSolution[i] = solution[i] + thetaB * change[i];
-        eval_grad_f(amplObjective_, numberColumns, tempSolution, true, tempGradient);
-        eval_f(amplObjective_, numberColumns, tempSolution, false, objB);
-        double changeObj = 0.0;
-        gradientNorm = 0.0;
-        for (i = 0; i < numberColumns; i++) {
-            changeObj += tempGradient[i] * change[i];
-            gradientNorm += tempGradient[i] * tempGradient[i];
-        }
-        gradientNorm = fabs(changeObj) / sqrt(gradientNorm);
-        // Should try and get quadratic convergence by interpolation
-        if (changeObj < 0.0) {
-            // increasing is good
-            thetaA = thetaB;
-        } else {
-            // decreasing is good
-            thetaC = thetaB;
-        }
-        thetaB = 0.5 * (thetaA + thetaC);
-    }
-    delete [] tempSolution;
-    delete [] tempGradient;
-    predictedObj = objB;
-    return thetaB;
-}
-// Return objective value (without any ClpModel offset) (model may be NULL)
-double
-ClpAmplObjective::objectiveValue(const ClpSimplex * model, const double * solution) const
-{
-    CbcAmplInfo * info = (CbcAmplInfo *) amplObjective_;
-    ASL_pfgh* asl = info->asl_;
-
-    int numberColumns = n_var;;
-    // current
-    double currentObj = 0.0;
-    eval_f(amplObjective_, numberColumns, solution, true, currentObj);
-    return currentObj;
-}
-// Scale objective
-void
-ClpAmplObjective::reallyScale(const double * columnScale)
-{
-    abort();
-}
-/* Given a zeroed array sets nonlinear columns to 1.
-   Returns number of nonlinear columns
-*/
-int
-ClpAmplObjective::markNonlinear(char * which)
-{
-    int iColumn;
-    CbcAmplInfo * info = (CbcAmplInfo *) amplObjective_;
-    ASL_pfgh* asl = info->asl_;
-    int nonLinear = CoinMax(nlvc, nlvo);
-    for (iColumn = 0; iColumn < nonLinear; iColumn++) {
-        which[iColumn] = 1;
-    }
-    int numberNonLinearColumns = 0;
-    int numberColumns = n_var;;
-    for (iColumn = 0; iColumn < numberColumns; iColumn++) {
-        if (which[iColumn])
-            numberNonLinearColumns++;
-    }
-    return numberNonLinearColumns;
-}
-// Say we have new primal solution - so may need to recompute
-void
-ClpAmplObjective::newXValues()
-{
-    CbcAmplInfo * info = (CbcAmplInfo *) amplObjective_;
-    info->conval_called_with_current_x_ = false;
-    info->objval_called_with_current_x_ = false;
-    info->jacval_called_with_current_x_ = false;
-}
-
-//#############################################################################
-// Constructors / Destructor / Assignment
-//#############################################################################
-//-------------------------------------------------------------------
-// Default Constructor
-//-------------------------------------------------------------------
-ClpConstraintAmpl::ClpConstraintAmpl ()
-        : ClpConstraint()
-{
-    type_ = 3;
-    column_ = NULL;
-    coefficient_ = NULL;
-    numberCoefficients_ = 0;
-    amplInfo_ = NULL;
-}
-
-//-------------------------------------------------------------------
-// Useful Constructor
-//-------------------------------------------------------------------
-ClpConstraintAmpl::ClpConstraintAmpl (int row, void * amplInfo)
-        : ClpConstraint()
-{
-    type_ = 3;
-    rowNumber_ = row;
-    amplInfo_ = amplInfo;
-    CbcAmplInfo * info = (CbcAmplInfo *) amplInfo_;
-#ifndef NDEBUG
-    ASL_pfgh* asl = info->asl_;
-#endif
-    // warning: nlc is a macro that assumes we have a variable called asl
-    assert (rowNumber_ < nlc);
-    numberCoefficients_ = info->rowStart_[rowNumber_+1] - info->rowStart_[rowNumber_];
-    column_ = CoinCopyOfArray(info->column_ + info->rowStart_[rowNumber_], numberCoefficients_);
-    coefficient_ = new double [numberCoefficients_];;
-}
-
-//-------------------------------------------------------------------
-// Copy constructor
-//-------------------------------------------------------------------
-ClpConstraintAmpl::ClpConstraintAmpl (const ClpConstraintAmpl & rhs)
-        : ClpConstraint(rhs)
-{
-    numberCoefficients_ = rhs.numberCoefficients_;
-    column_ = CoinCopyOfArray(rhs.column_, numberCoefficients_);
-    coefficient_ = CoinCopyOfArray(rhs.coefficient_, numberCoefficients_);
-}
-
-
-//-------------------------------------------------------------------
-// Destructor
-//-------------------------------------------------------------------
-ClpConstraintAmpl::~ClpConstraintAmpl ()
-{
-    delete [] column_;
-    delete [] coefficient_;
-}
-
-//----------------------------------------------------------------
-// Assignment operator
-//-------------------------------------------------------------------
-ClpConstraintAmpl &
-ClpConstraintAmpl::operator=(const ClpConstraintAmpl & rhs)
-{
-    if (this != &rhs) {
-        delete [] column_;
-        delete [] coefficient_;
-        numberCoefficients_ = rhs.numberCoefficients_;
-        column_ = CoinCopyOfArray(rhs.column_, numberCoefficients_);
-        coefficient_ = CoinCopyOfArray(rhs.coefficient_, numberCoefficients_);
-    }
-    return *this;
-}
-//-------------------------------------------------------------------
-// Clone
-//-------------------------------------------------------------------
-ClpConstraint * ClpConstraintAmpl::clone() const
-{
-    return new ClpConstraintAmpl(*this);
-}
-
-// Returns gradient
-int
-ClpConstraintAmpl::gradient(const ClpSimplex * model,
-                            const double * solution,
-                            double * gradient,
-                            double & functionValue,
-                            double & offset,
-                            bool useScaling,
-                            bool refresh) const
-{
-    CbcAmplInfo * info = (CbcAmplInfo *) amplInfo_;
-    ASL_pfgh* asl = info->asl_;
-    int numberColumns = n_var;;
-    // If not done then do all
-    if (!info->jacval_called_with_current_x_) {
-        bool getStuff = eval_g(amplInfo_, numberColumns, solution, true, info->constraintValues_);
-        assert (getStuff);
-        getStuff = eval_jac_g(amplInfo_, numberColumns, solution, false, info->gradient_);
-        assert (getStuff);
-        info->jacval_called_with_current_x_ = getStuff;
-    }
-    if (refresh || !lastGradient_) {
-        functionValue_ = info->constraintValues_[rowNumber_];
-        offset_ = functionValue_; // sign??
-        if (!lastGradient_)
-            lastGradient_ = new double[numberColumns];
-        CoinZeroN(lastGradient_, numberColumns);
-        assert (!(model && model->rowScale() && useScaling));
-        int i;
-        int start = info->rowStart_[rowNumber_];
-        assert (numberCoefficients_ == info->rowStart_[rowNumber_+1] - start);
-        for (i = 0; i < numberCoefficients_; i++) {
-            int iColumn = column_[i];
-            double valueS = solution[iColumn];
-            double valueG = info->gradient_[start+i];
-            lastGradient_[iColumn] = valueG;
-            offset_ -= valueS * valueG;
-        }
-    }
-    functionValue = functionValue_;
-    offset = offset_;
-    memcpy(gradient, lastGradient_, numberColumns*sizeof(double));
-    return 0;
-}
-// Resize constraint
-void
-ClpConstraintAmpl::resize(int newNumberColumns)
-{
-    abort();
-}
-// Delete columns in  constraint
-void
-ClpConstraintAmpl::deleteSome(int numberToDelete, const int * which)
-{
-    if (numberToDelete) {
-        abort();
-    }
-}
-// Scale constraint
-void
-ClpConstraintAmpl::reallyScale(const double * columnScale)
-{
-    abort();
-}
-/* Given a zeroed array sets nonlinear columns to 1.
-   Returns number of nonlinear columns
-*/
-int
-ClpConstraintAmpl::markNonlinear(char * which) const
-{
-    CbcAmplInfo * info = (CbcAmplInfo *) amplInfo_;
-    ASL_pfgh* asl = info->asl_;
-    int iColumn;
-    int numberNon = 0;
-    int nonLinear = CoinMax(nlvc, nlvo);
-    for (iColumn = 0; iColumn < numberCoefficients_; iColumn++) {
-        int jColumn = column_[iColumn];
-        if (jColumn < nonLinear) {
-            which[jColumn] = 1;
-            numberNon++;
-        }
-    }
-    return numberNon;
-}
-/* Given a zeroed array sets possible nonzero coefficients to 1.
-   Returns number of nonzeros
-*/
-int
-ClpConstraintAmpl::markNonzero(char * which) const
-{
-    int iColumn;
-    for (iColumn = 0; iColumn < numberCoefficients_; iColumn++) {
-        which[column_[iColumn]] = 1;
-    }
-    return numberCoefficients_;
-}
-// Number of coefficients
-int
-ClpConstraintAmpl::numberCoefficients() const
-{
-    return numberCoefficients_;
-}
-// Say we have new primal solution - so may need to recompute
-void
-ClpConstraintAmpl::newXValues()
-{
-    CbcAmplInfo * info = (CbcAmplInfo *) amplInfo_;
-    info->conval_called_with_current_x_ = false;
-    info->objval_called_with_current_x_ = false;
-    info->jacval_called_with_current_x_ = false;
-}
-
-/* Load nonlinear part of problem from AMPL info
-   Returns 0 if linear
-   1 if quadratic objective
-   2 if quadratic constraints
-   3 if nonlinear objective
-   4 if nonlinear constraints
-   -1 on failure
-*/
-int
-ClpSimplex::loadNonLinear(void * amplInfo, int & numberConstraints,
-                          ClpConstraint ** & constraints)
-{
-    numberConstraints = 0;
-    constraints = NULL;
-    CbcAmplInfo * info = (CbcAmplInfo *) amplInfo;
-    ASL_pfgh* asl = info->asl_;
-    // For moment don't say quadratic
-    int type = 0;
-    if (nlo + nlc) {
-        // nonlinear
-        if (!nlc) {
-            type = 3;
-            delete objective_;
-            objective_ = new ClpAmplObjective(amplInfo);
-        } else {
-            type = 4;
-            numberConstraints = nlc;
-            constraints = new ClpConstraint * [numberConstraints];
-            if (nlo) {
-                delete objective_;
-                objective_ = new ClpAmplObjective(amplInfo);
-            }
-            for (int i = 0; i < numberConstraints; i++) {
-                constraints[i] = new ClpConstraintAmpl(i, amplInfo);
-            }
-        }
-    }
-    return type;
-}
-#else
-#include "ClpSimplex.hpp"
-#include "ClpConstraint.hpp"
-int
-ClpSimplex::loadNonLinear(void * , int & ,
-                          ClpConstraint ** & )
-{
-    abort();
-    return 0;
-}
-#endif
-
diff --git a/cbits/coin/Cbc_C_Interface.cpp b/cbits/coin/Cbc_C_Interface.cpp
deleted file mode 100644
--- a/cbits/coin/Cbc_C_Interface.cpp
+++ /dev/null
@@ -1,2553 +0,0 @@
-// $Id: Cbc_C_Interface.cpp 1902 2013-04-10 16:58:16Z stefan $
-// Copyright (C) 2004, International Business Machines
-// Corporation and others.  All Rights Reserved.
-// This code is licensed under the terms of the Eclipse Public License (EPL).
-
-#include <math.h>
-#include <cfloat>
-
-#include "CoinPragma.hpp"
-//#include "CoinHelperFunctions.hpp"
-//#include "CoinPackedMatrix.hpp"
-#include "CoinTime.hpp"
-
-#include "CbcModel.hpp"
-#include "CbcBranchActual.hpp"
-
-#include "CoinMessageHandler.hpp"
-#include "OsiClpSolverInterface.hpp"
-
-//  bobe including extras.h to get strdup()
-#if defined(__MWERKS__)
-// #include <extras.h>  // bobe 06-02-14
-#endif
-
-// Get C stuff but with extern C
-#define CBC_EXTERN_C
-#include "Coin_C_defines.h"
-
-const int  VERBOSE = 0;
-
-// To allow call backs
-class Cbc_MessageHandler
-            : public CoinMessageHandler {
-
-public:
-    /**@name Overrides */
-    //@{
-    virtual int print();
-    //@}
-    /**@name set and get */
-    //@{
-    /// Model
-    const Cbc_Model * model() const;
-    void setModel(Cbc_Model * model);
-    /// Call back
-    void setCallBack(cbc_callback callback);
-    //@}
-
-    /**@name Constructors, destructor */
-    //@{
-    /** Default constructor. */
-    Cbc_MessageHandler();
-    /// Constructor with pointer to model
-    Cbc_MessageHandler(Cbc_Model * model,
-                       FILE * userPointer = NULL);
-    /** Destructor */
-    virtual ~Cbc_MessageHandler();
-    //@}
-
-    /**@name Copy method */
-    //@{
-    /** The copy constructor. */
-    Cbc_MessageHandler(const Cbc_MessageHandler&);
-    /** The copy constructor from an CoinSimplexMessageHandler. */
-    Cbc_MessageHandler(const CoinMessageHandler&);
-
-    Cbc_MessageHandler& operator=(const Cbc_MessageHandler&);
-    /// Clone
-    virtual CoinMessageHandler * clone() const ;
-    //@}
-
-
-protected:
-    /**@name Data members
-       The data members are protected to allow access for derived classes. */
-    //@{
-    /// Pointer back to model
-    Cbc_Model * model_;
-    /// call back
-    cbc_callback callback_;
-    //@}
-};
-
-
-//-------------------------------------------------------------------
-// Default Constructor
-//-------------------------------------------------------------------
-Cbc_MessageHandler::Cbc_MessageHandler ()
-        : CoinMessageHandler(),
-        model_(NULL),
-        callback_(NULL)
-{
-}
-
-//-------------------------------------------------------------------
-// Copy constructor
-//-------------------------------------------------------------------
-Cbc_MessageHandler::Cbc_MessageHandler (const Cbc_MessageHandler & rhs)
-        : CoinMessageHandler(rhs),
-        model_(rhs.model_),
-        callback_(rhs.callback_)
-{
-}
-
-Cbc_MessageHandler::Cbc_MessageHandler (const CoinMessageHandler & rhs)
-        : CoinMessageHandler(rhs),
-        model_(NULL),
-        callback_(NULL)
-{
-}
-
-// Constructor with pointer to model
-Cbc_MessageHandler::Cbc_MessageHandler(Cbc_Model * model,
-                                       FILE * /*userPointer*/)
-        : CoinMessageHandler(),
-        model_(model),
-        callback_(NULL)
-{
-}
-
-//-------------------------------------------------------------------
-// Destructor
-//-------------------------------------------------------------------
-Cbc_MessageHandler::~Cbc_MessageHandler ()
-{
-}
-
-//----------------------------------------------------------------
-// Assignment operator
-//-------------------------------------------------------------------
-Cbc_MessageHandler &
-Cbc_MessageHandler::operator=(const Cbc_MessageHandler & rhs)
-{
-    if (this != &rhs) {
-        CoinMessageHandler::operator=(rhs);
-        model_ = rhs.model_;
-        callback_ = rhs.callback_;
-    }
-    return *this;
-}
-//-------------------------------------------------------------------
-// Clone
-//-------------------------------------------------------------------
-CoinMessageHandler * Cbc_MessageHandler::clone() const
-{
-    return new Cbc_MessageHandler(*this);
-}
-int
-Cbc_MessageHandler::print()
-{
-    if (callback_) {
-        int messageNumber = currentMessage().externalNumber();
-        if (currentSource() != "Cbc")
-            messageNumber += 1000000;
-        int i;
-        int nDouble = numberDoubleFields();
-        assert (nDouble <= 200);
-        double vDouble[200];
-        for (i = 0; i < nDouble; i++)
-            vDouble[i] = doubleValue(i);
-        int nInt = numberIntFields();
-        assert (nInt <= 200);
-        int vInt[200];
-        for (i = 0; i < nInt; i++)
-            vInt[i] = intValue(i);
-        int nString = numberStringFields();
-        assert (nString <= 200);
-        char * vString[200];
-        for (i = 0; i < nString; i++) {
-            std::string value = stringValue(i);
-            vString[i] = CoinStrdup(value.c_str());
-        }
-        callback_(model_, messageNumber,
-                  nDouble, vDouble,
-                  nInt, vInt,
-                  nString, vString);
-        for (i = 0; i < nString; i++)
-            free(vString[i]);
-
-    }
-    return CoinMessageHandler::print();
-    return 0;
-}
-const Cbc_Model *
-Cbc_MessageHandler::model() const
-{
-    return model_;
-}
-void
-Cbc_MessageHandler::setModel(Cbc_Model * model)
-{
-    model_ = model;
-}
-// Call back
-void
-Cbc_MessageHandler::setCallBack(cbc_callback callback)
-{
-    callback_ = callback;
-}
-/**
-  *
-  *  C Interface Routines
-  *
-  */
-#include "Cbc_C_Interface.h"
-#include <string>
-#include <stdio.h>
-#include <iostream>
-
-#if defined(__MWERKS__)
-#pragma export on
-#endif
-
-/* Version */
-COINLIBAPI double COINLINKAGE Cbc_getVersion()
-{
-    double v = 1.0;
-    return v;
-}
-
-/* Default Cbc_Model constructor */
-COINLIBAPI Cbc_Model *  COINLINKAGE
-Cbc_newModel()
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_newModel(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    Cbc_Model * model = new Cbc_Model;
-    OsiClpSolverInterface solver1;
-    model->solver_    = &solver1;
-    model->solver_->OsiClpSolverInterface::setHintParam(OsiDoReducePrint, true, OsiHintTry);
-    model->model_     = new CbcModel(solver1);
-    model->handler_   = NULL;
-    model->information_ = NULL;
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-    return model;
-}
-/* Cbc_Model Destructor */
-COINLIBAPI void COINLINKAGE
-Cbc_deleteModel(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_deleteModel(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-    fflush(stdout);
-
-    if (VERBOSE > 1) printf("%s delete model->model_\n", prefix);
-    fflush(stdout);
-    delete model->model_;
-
-    if (VERBOSE > 1) printf("%s delete model->handler_\n", prefix);
-    fflush(stdout);
-    delete model->handler_;
-
-    if (VERBOSE > 1) printf("%s free model->information_\n", prefix);
-    fflush(stdout);
-    if (model->information_) free(model->information_);
-
-    if (VERBOSE > 1) printf("%s delete model\n", prefix);
-    fflush(stdout);
-    delete model;
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-    fflush(stdout);
-}
-
-/* Loads a problem (the constraints on the
-    rows are given by lower and upper bounds). If a pointer is NULL then the
-    following values are the default:
-    <ul>
-    <li> <code>colub</code>: all columns have upper bound infinity
-    <li> <code>collb</code>: all columns have lower bound 0
-    <li> <code>rowub</code>: all rows have upper bound infinity
-    <li> <code>rowlb</code>: all rows have lower bound -infinity
-    <li> <code>obj</code>: all variables have 0 objective coefficient
-    </ul>
-
-   Just like the other loadProblem() method except that the matrix is
-   given in a standard column major ordered format (without gaps).
-*/
-COINLIBAPI void COINLINKAGE
-Cbc_loadProblem (Cbc_Model * model,  const int numcols, const int numrows,
-                 const CoinBigIndex * start, const int* index,
-                 const double* value,
-                 const double* collb, const double* colub,
-                 const double* obj,
-                 const double* rowlb, const double* rowub)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_loadProblem(): ";
-//  const int  VERBOSE = 2;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    OsiSolverInterface * solver = model->model_->solver();
-
-    if (VERBOSE > 1) {
-        printf("%s numcols = %i, numrows = %i\n",
-               prefix, numcols, numrows);
-        printf("%s model = %p, start = %p, index = %p, value = %p\n",
-               prefix, static_cast<void*>(model), static_cast<const void*>(start),
-               static_cast<const void*>(index), static_cast<const void*>(value));
-        printf("%s collb = %p, colub = %p, obj = %p, rowlb = %p, rowub = %p\n",
-               prefix, static_cast<const void*>(collb),
-               static_cast<const void*>(colub), static_cast<const void*>(obj),
-               static_cast<const void*>(rowlb), static_cast<const void*>(rowub));
-    }
-
-    if (VERBOSE > 1) printf("%s Calling solver->loadProblem()\n", prefix);
-    fflush(stdout);
-
-    if (1) {
-        solver->loadProblem(numcols, numrows, start, index, value,
-                            collb, colub, obj, rowlb, rowub);
-    } else {
-        solver->loadProblem(0, 0, NULL, NULL, NULL,
-                            NULL, NULL, NULL, NULL, NULL);
-    }
-    if (VERBOSE > 1) printf("%s Finished solver->loadProblem()\n", prefix);
-    fflush(stdout);
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-} //  Cbc_loadProblem()
-
-/* Read an mps file from the given filename */
-COINLIBAPI int COINLINKAGE
-Cbc_readMps(Cbc_Model * model, const char *filename)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_readMps(): ";
-//  const int  VERBOSE = 2;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-    if (VERBOSE > 1) printf("%s filename = '%s'\n", prefix, filename);
-
-    int result = 1;
-    result = model->model_->solver()->readMps(filename);
-    assert(result == 0);
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-/* Write an mps file from the given filename */
-COINLIBAPI void COINLINKAGE
-Cbc_writeMps(Cbc_Model * model, const char *filename)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_writeMps(): ";
-//  const int  VERBOSE = 2;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-    if (VERBOSE > 1) printf("%s filename = '%s'\n", prefix, filename);
-
-    model->model_->solver()->writeMps(filename, "mps", Cbc_optimizationDirection(model));
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-    return;
-}
-/* Integer information */
-COINLIBAPI char * COINLINKAGE
-Cbc_integerInformation(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_integerInformation(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int col;
-    int numcols = Cbc_getNumCols(model);
-
-    // allocate model->information_ if null
-    // this is freed in Cbc_deleteModel() if not null
-    if (!model->information_)
-        model->information_ = (char *) malloc(numcols * sizeof(char));
-
-    for (col = 0; col < numcols; col++)
-        if (model->model_->solver()->isContinuous(col))
-            model->information_[col] = 0;
-        else
-            model->information_[col] = 1;
-
-    char * result = model->information_;
-
-    if (VERBOSE > 0) printf("%s return %p\n", prefix, result);
-    return result;
-}
-/* Copy in integer information */
-COINLIBAPI void COINLINKAGE
-Cbc_copyInIntegerInformation(Cbc_Model * model, const char * information)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_copyInIntegerInformation(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int col;
-    int numcols = Cbc_getNumCols(model);
-    for (col = 0; col < numcols; col++)
-        if (information[col])
-            model->model_->solver()->setInteger(col);
-        else
-            model->model_->solver()->setContinuous(col);
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-/* Drop integer informations */
-COINLIBAPI void COINLINKAGE
-Cbc_deleteIntegerInformation(Cbc_Model * /*model*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_deleteIntegerInformation(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-//  available through
-//    OsiClpSolverInterface::setContinuous
-//tbd  model->model_->deleteIntegerInformation();
-    if (VERBOSE > 0) printf("%s WARNING: NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-/* Resizes rim part of model  */
-COINLIBAPI void COINLINKAGE
-Cbc_resize (Cbc_Model * /*model*/, int /*newNumberRows*/,
-            int /*newNumberColumns*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_resize(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-// cannot find this in Cbc, Osi, or OsiClp
-//tbd  model->model_->solver()->resize(newNumberRows,newNumberColumns);
-    if (VERBOSE > 0) printf("%s WARNING: NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-/* Deletes rows */
-COINLIBAPI void COINLINKAGE
-Cbc_deleteRows(Cbc_Model * model, int number, const int * which)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_deleteRows(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    OsiSolverInterface * solver = model->model_->solver();
-    solver->deleteRows(number, which);
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-/* Add rows */
-COINLIBAPI void COINLINKAGE
-Cbc_addRows(Cbc_Model * /*model*/, const int /*number*/,
-            const double * /*rowLower*/,
-            const double * /*rowUpper*/,
-            const int * /*rowStarts*/, const int * /*columns*/,
-            const double * /*elements*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_addRows(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-// available through OsiClp
-//tbd  model->model_->addRows(number,rowLower,rowUpper,rowStarts,columns,elements);
-    if (VERBOSE > 0) printf("%s WARNING: NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-
-/* Deletes columns */
-COINLIBAPI void COINLINKAGE
-Cbc_deleteColumns(Cbc_Model * model, int number, const int * which)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_deleteColumns(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    OsiSolverInterface * solver = model->model_->solver();
-    solver->deleteCols(number, which);
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-/* Add columns */
-COINLIBAPI void COINLINKAGE
-Cbc_addColumns(Cbc_Model * /*model*/, int /*number*/,
-               const double * /*columnLower*/,
-               const double * /*columnUpper*/,
-               const double * /*objective*/,
-               const int * /*columnStarts*/, const int * /*rows*/,
-               const double * /*elements*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_addColumns(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-// available through OsiClp
-//tbd  model->model_->addColumns(number,columnLower,columnUpper,objective,
-//tbd			    columnStarts,rows,elements);
-    if (VERBOSE > 0) printf("%s WARNING: NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-/* Drops names - makes lengthnames 0 and names empty */
-COINLIBAPI void COINLINKAGE
-Cbc_dropNames(Cbc_Model * /*model*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_dropNames(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-// cannot find names in Cbc, Osi, or OsiClp
-//tbd  model->model_->dropNames();
-    if (VERBOSE > 0) printf("%s WARNING: NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-/* Copies in names */
-COINLIBAPI void COINLINKAGE
-Cbc_copyNames(Cbc_Model * /*model*/, const char * const * /*rowNamesIn*/,
-              const char * const * /*columnNamesIn*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_copyNames(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-// cannot find names in Cbc, Osi, or OsiClp
-    /*clean
-      int iRow;
-      std::vector<std::string> rowNames;
-      int numberRows = model->model_->getNumRows();
-      rowNames.reserve(numberRows);
-      for (iRow=0;iRow<numberRows;iRow++) {
-        rowNames.push_back(rowNamesIn[iRow]);
-      }
-
-      int iColumn;
-      std::vector<std::string> columnNames;
-      int numberColumns = model->model_->getNumCols();
-      columnNames.reserve(numberColumns);
-      for (iColumn=0;iColumn<numberColumns;iColumn++) {
-        columnNames.push_back(columnNamesIn[iColumn]);
-      }
-      model->model_->copyNames(rowNames,columnNames);
-    */
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-
-/* Number of rows */
-COINLIBAPI int COINLINKAGE
-Cbc_numberRows(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_numberRows(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-    result = model->model_->getNumRows();
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-/* Number of columns */
-COINLIBAPI int COINLINKAGE
-Cbc_numberColumns(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_numberColumns(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-    result = model->model_->getNumCols();
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-/* Primal tolerance to use */
-COINLIBAPI double COINLINKAGE
-Cbc_primalTolerance(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_primalTolerance(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    double result = 0.0;
-    model->model_->solver()->getDblParam(OsiPrimalTolerance, result) ;
-
-    if (VERBOSE > 0) printf("%s return %g\n", prefix, result);
-    return result;
-}
-COINLIBAPI void COINLINKAGE
-Cbc_setPrimalTolerance(Cbc_Model * model,  double value)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_setPrimalTolerance(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    model->model_->solver()->setDblParam(OsiPrimalTolerance, value) ;
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-/* Dual tolerance to use */
-COINLIBAPI double COINLINKAGE
-Cbc_dualTolerance(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_dualTolerance(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    double result = 0.0;
-    model->model_->solver()->getDblParam(OsiDualTolerance, result) ;
-
-    if (VERBOSE > 0) printf("%s return %g\n", prefix, result);
-    return result;
-}
-COINLIBAPI void COINLINKAGE
-Cbc_setDualTolerance(Cbc_Model * model,  double value)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_setDualTolerance(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    model->model_->solver()->setDblParam(OsiDualTolerance, value) ;
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-/* Integer tolerance to use */
-COINLIBAPI double COINLINKAGE
-Cbc_integerTolerance(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_primalTolerance(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    double result = 0.0;
-    result = model->model_->getDblParam(CbcModel::CbcIntegerTolerance) ;
-
-    if (VERBOSE > 0) printf("%s return %g\n", prefix, result);
-    return result;
-}
-COINLIBAPI void COINLINKAGE
-Cbc_setIntegerTolerance(Cbc_Model * model,  double value)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_setPrimalTolerance(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    model->model_->setDblParam(CbcModel::CbcIntegerTolerance, value) ;
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-/* Dual objective limit */
-COINLIBAPI double COINLINKAGE
-Cbc_dualObjectiveLimit(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_dualObjectiveLimit(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    double result = 0.0;
-    model->model_->solver()->getDblParam(OsiDualObjectiveLimit, result) ;
-
-    if (VERBOSE > 0) printf("%s return %g\n", prefix, result);
-    return result;
-}
-COINLIBAPI void COINLINKAGE
-Cbc_setDualObjectiveLimit(Cbc_Model * model, double value)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_setDualObjectiveLimit(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    model->model_->solver()->setDblParam(OsiDualObjectiveLimit, value) ;
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-/* Objective offset */
-COINLIBAPI double COINLINKAGE
-Cbc_objectiveOffset(Cbc_Model * /*model*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_objectiveOffset(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    double result = 0.0;
-// cannot find names in Cbc, Osi, or OsiClp
-//tbd  return model->model_->objectiveOffset();
-    if (VERBOSE > 0) printf("%s WARNING: NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return %g\n", prefix, result);
-    return result;
-}
-COINLIBAPI void COINLINKAGE
-Cbc_setObjectiveOffset(Cbc_Model * /*model*/, double /*value*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_setObjectiveOffset(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-// cannot find names in Cbc, Osi, or OsiClp
-//tbd  model->model_->solver()->setObjectiveOffset(value);
-    if (VERBOSE > 0) printf("%s WARNING: NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-/* Fills in array with problem name  */
-COINLIBAPI void COINLINKAGE
-Cbc_problemName(Cbc_Model * model, int maxNumberCharacters, char * array)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_problemName(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    std::string name;
-    model->model_->solver()->getStrParam(OsiProbName, name);
-    maxNumberCharacters = CoinMin(maxNumberCharacters, (int)strlen(name.c_str()));
-    strncpy(array, name.c_str(), maxNumberCharacters - 1);
-    array[maxNumberCharacters-1] = '\0';
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-/* Sets problem name.  Must have \0 at end.  */
-COINLIBAPI int COINLINKAGE
-Cbc_setProblemName(Cbc_Model * model, int /*maxNumberCharacters*/, char * array)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_setProblemName(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    bool result = false;
-    result = model->model_->solver()->setStrParam(OsiProbName, array);
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-    return (result) ? 1 : 0;
-}
-/* Number of iterations */
-COINLIBAPI int COINLINKAGE
-Cbc_numberIterations(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_numberIterations(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-    result = model->model_->getIterationCount();
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-COINLIBAPI void COINLINKAGE
-Cbc_setNumberIterations(Cbc_Model * /*model*/, int /*numberIterations*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_setNumberIterations(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-// cannot find this in Cbc, Osi, or OsiClp
-//tbd  model->model_->setNumberIterations(numberIterations);
-    if (VERBOSE > 0) printf("%s WARNING: NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-    return;
-}
-/* Maximum number of iterations */
-COINLIBAPI int COINLINKAGE
-Cbc_maximumIterations(Cbc_Model * /*model*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_maximumIterations(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-// cannot find this in Cbc, Osi, or OsiClp
-//tbd  result = model->model_->solver()->maximumIterations();
-    if (VERBOSE > 0) printf("%s WARNING: NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-COINLIBAPI void COINLINKAGE
-Cbc_setMaximumIterations(Cbc_Model * /*model*/, int /*value*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_setMaximumIterations(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-// cannot find this in Cbc, Osi, or OsiClp
-//tbd  model->model_->setMaximumIterations(value);
-    if (VERBOSE > 0) printf("%s WARNING: NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-/* Maximum number of nodes */
-COINLIBAPI int COINLINKAGE
-Cbc_maxNumNode(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_maxNumNode(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-    result = model->model_->getIntParam(CbcModel::CbcMaxNumNode);
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-COINLIBAPI void COINLINKAGE
-Cbc_setMaxNumNode(Cbc_Model * model, int value)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_setMaxNumNode(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    model->model_->setIntParam(CbcModel::CbcMaxNumNode, value);
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-/* Maximum number of solutions */
-COINLIBAPI int COINLINKAGE
-Cbc_maxNumSol(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::maxNumSol(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-    result = model->model_->getIntParam(CbcModel::CbcMaxNumSol);
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-COINLIBAPI void COINLINKAGE
-Cbc_setMaxNumSol(Cbc_Model * model, int value)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_setMaxNumSol(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    model->model_->setIntParam(CbcModel::CbcMaxNumSol, value);
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-/* Maximum time in seconds (from when set called) */
-COINLIBAPI double COINLINKAGE
-Cbc_maximumSeconds(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_maximumSeconds(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    double result = 0.0;
-    result = model->model_->getDblParam(CbcModel::CbcMaximumSeconds);
-
-    if (VERBOSE > 0) printf("%s return %g\n", prefix, result);
-    return result;
-}
-COINLIBAPI void COINLINKAGE
-Cbc_setMaximumSeconds(Cbc_Model * model, double value)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_setMaximumSeconds(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    model->model_->setDblParam(CbcModel::CbcMaximumSeconds, value);
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-/* Returns true if hit maximum iteratio`ns (or time) */
-COINLIBAPI int COINLINKAGE
-Cbc_hitMaximumIterations(Cbc_Model * /*model*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_hitMaximumIterations(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-// cannot find names in Cbc, Osi, or OsiClp
-//tbd  result = model->model_->solver()->hitMaximumIterations() ? 1 : 0;
-    if (VERBOSE > 0) printf("%s WARNING: NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-/* Status of problem:
-   0 - optimal
-   1 - primal infeasible
-   2 - dual infeasible
-   3 - stopped on iterations etc
-   4 - stopped due to errors
-*/
-COINLIBAPI int COINLINKAGE
-Cbc_status(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_status(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-    result = model->model_->status();
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-/* Set problem status */
-COINLIBAPI void COINLINKAGE
-Cbc_setProblemStatus(Cbc_Model * /*model*/, int /*problemStatus*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_setProblemStatus(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-// cannot find this in Cbc, Osi, or OsiClp
-//tbd  model->model_->setProblemStatus(problemStatus);
-    if (VERBOSE > 0) printf("%s WARNING: NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-/* Secondary status of problem - may get extended
-   0 - none
-   1 - primal infeasible because dual limit reached
-   2 - scaled problem optimal - unscaled has primal infeasibilities
-   3 - scaled problem optimal - unscaled has dual infeasibilities
-   4 - scaled problem optimal - unscaled has both dual and primal infeasibilities
-*/
-COINLIBAPI int COINLINKAGE
-Cbc_secondaryStatus(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_secondaryStatus(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-// cannot find this in Cbc, Osi, or OsiClp
-    result = model->model_->secondaryStatus();
-    if (VERBOSE > 0) printf("%s WARNING: NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-COINLIBAPI void COINLINKAGE
-Cbc_setSecondaryStatus(Cbc_Model * /*model*/, int /*status*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_setSecondaryStatus(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-// cannot find this in Cbc, Osi, or OsiClp
-//tbd  model->model_->setSecondaryStatus(status);
-    if (VERBOSE > 0) printf("%s WARNING: NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-/* Direction of optimization (1 - minimize, -1 - maximize, 0 - ignore */
-COINLIBAPI double COINLINKAGE
-Cbc_optimizationDirection(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_optimizationDirection(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    double result = 0.0;
-    result = model->model_->getObjSense();
-
-    if (VERBOSE > 0) printf("%s return %g\n", prefix, result);
-    return result;
-}
-COINLIBAPI void COINLINKAGE
-Cbc_setOptimizationDirection(Cbc_Model * model, double value)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_setOptimizationDirection(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin, value = %g\n", prefix, value);
-
-    model->model_->setObjSense(value);
-//  model->model_->solver()->setObjSense(value);
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-/* Primal row solution */
-COINLIBAPI double * COINLINKAGE
-Cbc_primalRowSolution(Cbc_Model * /*model*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_primalRowSolution(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    double * result = NULL;
-
-// cannot find this in Cbc, Osi, or OsiClp
-// may have to make it somehow
-//tbd  return model->model_->primalRowSolution();
-    if (VERBOSE > 0) printf("%s WARNING: NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return %p\n", prefix, static_cast<void*>(result));
-    return result;
-}
-/* Primal column solution */
-COINLIBAPI double * COINLINKAGE
-Cbc_primalColumnSolution(Cbc_Model * /*model*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_primalColumnSolution(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    double * result = NULL;
-// cannot find this in Cbc, Osi, or OsiClp
-// may have to make it somehow
-//  result = model->model_->getColSolution();
-    if (VERBOSE > 0) printf("%s WARNING: NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return %p\n", prefix, static_cast<void*>(result));
-    return result;
-}
-/* Dual row solution */
-COINLIBAPI double * COINLINKAGE
-Cbc_dualRowSolution(Cbc_Model * /*model*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_dualRowSolution(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    double * result = NULL;
-// cannot find this in Cbc, Osi, or OsiClp
-// may have to make it somehow
-//tbd  return model->model_->dualRowSolution();
-    if (VERBOSE > 0) printf("%s WARNING: NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return %p\n", prefix, static_cast<void*>(result));
-    return NULL;
-}
-/* Reduced costs */
-COINLIBAPI double * COINLINKAGE
-Cbc_dualColumnSolution(Cbc_Model * /*model*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_dualColumnSolution(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    double * result = NULL;
-// cannot find this in Cbc, Osi, or OsiClp
-// may have to make it somehow
-//tbd  return model->model_->dualColumnSolution();
-    if (VERBOSE > 0) printf("%s WARNING: NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return %p\n", prefix, static_cast<void*>(result));
-    return NULL;
-}
-/* Row lower */
-COINLIBAPI double * COINLINKAGE
-Cbc_rowLower(Cbc_Model * /*model*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_rowLower(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    double * result = NULL;
-// cannot find this in Cbc, Osi, or OsiClp
-// may have to make it somehow
-//tbd  return model->model_->rowLower();
-    if (VERBOSE > 0) printf("%s WARNING: NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return %p\n", prefix, static_cast<void*>(result));
-    return NULL;
-}
-/* Row upper  */
-COINLIBAPI double * COINLINKAGE
-Cbc_rowUpper(Cbc_Model * /*model*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_rowUpper(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    double * result = NULL;
-// cannot find this in Cbc, Osi, or OsiClp
-// may have to make it somehow
-//tbd  return model->model_->rowUpper();
-    if (VERBOSE > 0) printf("%s WARNING: NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return %p\n", prefix, static_cast<void*>(result));
-    return NULL;
-}
-/* Objective Coefficients */
-COINLIBAPI double * COINLINKAGE
-Cbc_objective(Cbc_Model * /*model*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_objective(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    double * result = NULL;
-// cannot find this in Cbc, Osi, or OsiClp
-// may have to make it somehow
-//  result = model->model_->objective();
-    if (VERBOSE > 0) printf("%s WARNING: NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return %p\n", prefix, static_cast<void*>(result));
-    return NULL;
-}
-/* Column Lower */
-COINLIBAPI double * COINLINKAGE
-Cbc_columnLower(Cbc_Model * /*model*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_columnLower(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    double * result = NULL;
-// cannot find this in Cbc, Osi, or OsiClp
-// may have to make it somehow
-//tbd  return model->model_->columnLower();
-    if (VERBOSE > 0) printf("%s WARNING: NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return %p\n", prefix, static_cast<void*>(result));
-    return NULL;
-}
-/* Column Upper */
-COINLIBAPI double * COINLINKAGE
-Cbc_columnUpper(Cbc_Model * /*model*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_columnUpper(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    double * result = NULL;
-// cannot find this in Cbc, Osi, or OsiClp
-// may have to make it somehow
-//tbd  return model->model_->columnUpper();
-    if (VERBOSE > 0) printf("%s WARNING: NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return %p\n", prefix, static_cast<void*>(result));
-    return NULL;
-}
-/* Number of elements in matrix */
-COINLIBAPI int COINLINKAGE
-Cbc_getNumElements(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_getNumElements(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-    result = model->model_->getNumElements();
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-
-// Column starts in matrix
-COINLIBAPI const CoinBigIndex * COINLINKAGE
-Cbc_getVectorStarts(Cbc_Model * model)
-{
-    const CoinPackedMatrix * matrix = NULL;
-    matrix = model->model_->solver()->getMatrixByCol();
-    return (matrix == NULL) ? NULL : matrix->getVectorStarts();
-}
-// Row indices in matrix
-COINLIBAPI const int * COINLINKAGE
-Cbc_getIndices(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_getIndices(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    const int * result = NULL;
-    const CoinPackedMatrix * matrix = NULL;
-    matrix = model->model_->solver()->getMatrixByCol();
-    result = (matrix == NULL) ? NULL : matrix->getIndices();
-
-    if (VERBOSE > 0)
-        printf("%s return %p\n", prefix, static_cast<const void*>(result));
-    return result;
-}
-
-// Column vector lengths in matrix
-COINLIBAPI const int * COINLINKAGE
-Cbc_getVectorLengths(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_getVectorLengths(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    const int * result = NULL;
-    const CoinPackedMatrix * matrix = NULL;
-    matrix = model->model_->solver()->getMatrixByCol();
-    result = (matrix == NULL) ? NULL : matrix->getVectorLengths();
-
-    if (VERBOSE > 0)
-        printf("%s return %p\n", prefix, static_cast<const void*>(result));
-    return result;
-}
-
-// Element values in matrix
-COINLIBAPI const double * COINLINKAGE
-Cbc_getElements(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_getElements(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    const double * result = NULL;
-    const CoinPackedMatrix * matrix = NULL;
-    matrix = model->model_->solver()->getMatrixByCol();
-    result = (matrix == NULL) ? NULL : matrix->getElements();
-
-    if (VERBOSE > 0)
-        printf("%s return %p\n", prefix, static_cast<const void*>(result));
-    return result;
-}
-// ======================================================================
-
-/* Objective value */
-COINLIBAPI double COINLINKAGE
-Cbc_objectiveValue(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_objectiveValue(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    double result = 0.0;
-    result = model->model_->getObjValue();
-
-    if (VERBOSE > 0) printf("%s return %g\n", prefix, result);
-    return result;
-}
-/* Infeasibility/unbounded ray (NULL returned if none/wrong)
-   Up to user to use delete [] on these arrays.  */
-COINLIBAPI double * COINLINKAGE
-Cbc_infeasibilityRay(Cbc_Model * /*model*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_infeasibilityRay(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    double * result = NULL;
-    // lots of rays (probably too many) are available in
-    // OsiClpSolverInterface::getDualRays()
-    //
-//tbd  result = model->model_->infeasibilityRay();
-    if (VERBOSE > 0) printf("%s WARNING: NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return %p\n", prefix, static_cast<void*>(result));
-    return result;
-}
-COINLIBAPI double * COINLINKAGE
-Cbc_unboundedRay(Cbc_Model * /*model*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_unboundedRay(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    double * result = NULL;
-    // lots of rays (probably too many) are available in
-    // OsiClpSolverInterface::getPrimalRays()
-    //
-//tbd  result = model->model_->unboundedRay();
-    if (VERBOSE > 0) printf("%s WARNING: NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return %p\n", prefix, static_cast<void*>(result));
-    return result;
-}
-/* See if status array exists (partly for OsiClp) */
-COINLIBAPI int COINLINKAGE
-Cbc_statusExists(Cbc_Model * /*model*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_statusExists(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-//tbd  result = model->model_->statusExists() ? 1 : 0;
-    if (VERBOSE > 0) printf("%s WARNING: NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-/* Return address of status array (char[numberRows+numberColumns]) */
-COINLIBAPI void  COINLINKAGE
-Cbc_getBasisStatus(Cbc_Model * /*model*/, int * /*cstat*/, int * /*rstat*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_getBasisStatus(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-// have to figure this out
-//tbd  model->model_->solver()->getBasisStatus(cstat, rstat);
-    if (VERBOSE > 0) printf("%s WARNING: NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-    return;
-}
-/* Copy in status vector */
-COINLIBAPI void COINLINKAGE
-Cbc_setBasisStatus(Cbc_Model * /*model*/,  int * /*cstat*/, int * /*rstat*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_setBasisStatus(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-//  model->model_->solver()->setBasisStatus(cstat, rstat);
-    if (VERBOSE > 0) printf("%s WARNING: NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-
-/* User pointer for whatever reason */
-COINLIBAPI void COINLINKAGE
-Cbc_setUserPointer (Cbc_Model * /*model*/, void * /*pointer*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_setUserPointer(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    // not sure what this is for
-    //
-//tbd  model->model_->setUserPointer(pointer);
-    if (VERBOSE > 0) printf("%s WARNING: NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-COINLIBAPI void * COINLINKAGE
-Cbc_getUserPointer (Cbc_Model * /*model*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_getUserPointer(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    void * result = NULL;
-    // not sure what this is for
-    //
-//tbd result = model->model_->getUserPointer();
-    if (VERBOSE > 0) printf("%s WARNING:  NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return %p\n", prefix, result);
-    return result;
-}
-/* Pass in Callback function */
-COINLIBAPI void COINLINKAGE
-Cbc_registerCallBack(Cbc_Model * model,
-                     cbc_callback userCallBack)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_registerCallBack(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    // reuse existing log level
-    int oldLogLevel = model->model_->messageHandler()->logLevel();
-    // Will be copy of users one
-    delete model->handler_;
-    model->handler_ = new Cbc_MessageHandler(*(model->model_->messageHandler()));
-    model->handler_->setCallBack(userCallBack);
-    model->handler_->setModel(model);
-    model->model_->passInMessageHandler(model->handler_);
-    model->model_->messageHandler()->setLogLevel(oldLogLevel);
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-/* Unset Callback function */
-COINLIBAPI void COINLINKAGE
-Cbc_clearCallBack(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_clearCallBack(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    delete model->handler_;
-    model->handler_ = NULL;
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-/* Amount of print out:
-   0 - none
-   1 - just final
-   2 - just factorizations
-   3 - as 2 plus a bit more
-   4 - verbose
-   above that 8,16,32 etc just for selective debug
-*/
-COINLIBAPI void COINLINKAGE
-Cbc_setLogLevel(Cbc_Model * model, int value)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_setLogLevel(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-    if (VERBOSE > 1) printf("%s value = %i\n", prefix, value);
-
-    model->model_->messageHandler()->setLogLevel(value);
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-COINLIBAPI int COINLINKAGE
-Cbc_logLevel(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_logLevel(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-    result = model->model_->messageHandler()->logLevel();
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-/* length of names (0 means no names0 */
-COINLIBAPI int COINLINKAGE
-Cbc_lengthNames(Cbc_Model * /*model*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_lengthNames(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-// cannot find names in Cbc, Osi, or OsiClp
-//tbd  result = model->model_->lengthNames();
-    if (VERBOSE > 0) printf("%s WARNING:  NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-/* Fill in array (at least lengthNames+1 long) with a row name */
-COINLIBAPI void COINLINKAGE
-Cbc_rowName(Cbc_Model * /*model*/, int iRow, char * name)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_rowName(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    sprintf(name, "ROW%5i", iRow);
-// cannot find names in Cbc, Osi, or OsiClp
-//tbd  std::string rowName=model->model_->rowName(iRow);
-//tbd  strcpy(name,rowName.c_str());
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-/* Fill in array (at least lengthNames+1 long) with a column name */
-// cannot find names in Cbc, Osi, or OsiClp
-COINLIBAPI void COINLINKAGE
-Cbc_columnName(Cbc_Model * /*model*/, int iColumn, char * name)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_columnName(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    sprintf(name, "COL%5i", iColumn);
-//tbd  std::string columnName= model->model_->columnName(iColumn);
-//tbd  strcpy(name,columnName.c_str());
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-
-/* General branch and bound solve algorithm which can do presolve.
-   See  CbcSolve.hpp for options
-*/
-COINLIBAPI int COINLINKAGE
-Cbc_initialSolve(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_initialSolve(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-    model->model_->initialSolve();
-    result = model->model_->status();
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-/* General solve algorithm which can do presolve.
-   See  CbcModel.hpp for options
-*/
-COINLIBAPI int COINLINKAGE
-Cbc_branchAndBound(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_branchAndBound(): ";
-//  const int  VERBOSE = 3;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-    if (VERBOSE > 2) Cbc_printModel(model, prefix);
-    try {
-        model->model_->branchAndBound();
-        model->model_->solver()->resolve();
-    } catch (CoinError e) {
-        printf("%s ERROR: %s::%s, %s\n", prefix,
-               e.className().c_str(), e.methodName().c_str(), e.message().c_str());
-    }
-    result = model->model_->status();
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-/* Sets or unsets scaling, 0 -off, 1 equilibrium, 2 geometric, 3, auto, 4 dynamic(later) */
-COINLIBAPI void COINLINKAGE
-Cbc_scaling(Cbc_Model * model, int mode)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_scaling(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    OsiSolverInterface * solver = model->model_->solver();
-    bool modeBool = (mode == 0);
-    solver->setHintParam(OsiDoScale, modeBool);
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-/* Gets scalingFlag */
-COINLIBAPI int COINLINKAGE
-Cbc_scalingFlag(Cbc_Model * /*model*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_scalingFlag(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-// try to use OsiSolverInterface::getHintParam(OsiDoScale, ???)
-//tbd  result = model->model_->scalingFlag();
-    if (VERBOSE > 0) printf("%s WARNING:  NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-/* Crash - at present just aimed at dual, returns
-   -2 if dual preferred and crash basis created
-   -1 if dual preferred and all slack basis preferred
-   0 if basis going in was not all slack
-   1 if primal preferred and all slack basis preferred
-   2 if primal preferred and crash basis created.
-
-   if gap between bounds <="gap" variables can be flipped
-
-   If "pivot" is
-   0 No pivoting (so will just be choice of algorithm)
-   1 Simple pivoting e.g. gub
-   2 Mini iterations
-*/
-COINLIBAPI int COINLINKAGE
-Cbc_crash(Cbc_Model * /*model*/, double /*gap*/, int /*pivot*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_crash(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-// cannot find names in Cbc, Osi, or OsiClp
-//tbd  result = model->model_->crash(gap,pivot);
-    if (VERBOSE > 0) printf("%s WARNING:  NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-/* If problem is primal feasible */
-COINLIBAPI int COINLINKAGE
-Cbc_primalFeasible(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_primalFeasible(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-    OsiSolverInterface * solver = model->model_->solver();
-    result = solver->isProvenPrimalInfeasible() ? 0 : 1;
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-/* If problem is dual feasible */
-COINLIBAPI int COINLINKAGE
-Cbc_dualFeasible(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_dualFeasible(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-    OsiSolverInterface * solver = model->model_->solver();
-    result = solver->isProvenDualInfeasible() ? 0 : 1;
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-/* Dual bound */
-COINLIBAPI double COINLINKAGE
-Cbc_dualBound(Cbc_Model * /*model*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_dualBound(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    double result = 0;
-// cannot find in Cbc, Osi, or OsiClp
-//tbd  result = model->model_->dualBound();
-    if (VERBOSE > 0) printf("%s WARNING:  NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return %g\n", prefix, result);
-    return result;
-}
-COINLIBAPI void COINLINKAGE
-Cbc_setDualBound(Cbc_Model * /*model*/, double /*value*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_setDualBound(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-// cannot find names in Cbc, Osi, or OsiClp
-//tbd  model->model_->setDualBound(value);
-    if (VERBOSE > 0) printf("%s WARNING:  NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-/* Infeasibility cost */
-COINLIBAPI double COINLINKAGE
-Cbc_infeasibilityCost(Cbc_Model * /*model*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_infeasibilityCost(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    double result = 0;
-// cannot find names in Cbc, Osi, or OsiClp
-//tbd  result = model->model_->solver()->infeasibilityCost();
-    if (VERBOSE > 0) printf("%s WARNING:  NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return %g\n", prefix, result);
-    return result;
-}
-COINLIBAPI void COINLINKAGE
-Cbc_setInfeasibilityCost(Cbc_Model * /*model*/, double /*value*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_setInfeasibilityCost(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-// cannot find names in Cbc, Osi, or OsiClp
-//tbd  model->model_->setInfeasibilityCost(value);
-    if (VERBOSE > 0) printf("%s WARNING:  NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-/* Perturbation:
-   50  - switch on perturbation
-   100 - auto perturb if takes too long (1.0e-6 largest nonzero)
-   101 - we are perturbed
-   102 - don't try perturbing again
-   default is 100
-   others are for playing
-*/
-COINLIBAPI int COINLINKAGE
-Cbc_perturbation(Cbc_Model * /*model*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_perturbation(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-// cannot find names in Cbc, Osi, or OsiClp
-//tbd  result = model->model_->perturbation();
-    if (VERBOSE > 0) printf("%s WARNING:  NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-COINLIBAPI void COINLINKAGE
-Cbc_setPerturbation(Cbc_Model * /*model*/, int /*value*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_setPerturbation(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-// cannot find names in Cbc, Osi, or OsiClp
-//tbd  model->model_->setPerturbation(value);
-    if (VERBOSE > 0) printf("%s WARNING:  NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-/* Current (or last) algorithm */
-COINLIBAPI int COINLINKAGE
-Cbc_algorithm(Cbc_Model * /*model*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_setPerturbation(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-// cannot find names in Cbc, Osi, or OsiClp
-//tbd  result = model->model_->algorithm();
-    if (VERBOSE > 0) printf("%s WARNING:  NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-/* Set algorithm */
-COINLIBAPI void COINLINKAGE
-Cbc_setAlgorithm(Cbc_Model * /*model*/, int /*value*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_setAlgorithm(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-// cannot find names in Cbc, Osi, or OsiClp
-//tbd  model->model_->setAlgorithm(value);
-    if (VERBOSE > 0) printf("%s WARNING:  NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}
-/* Sum of dual infeasibilities */
-COINLIBAPI double COINLINKAGE
-Cbc_sumDualInfeasibilities(Cbc_Model * /*model*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_sumDualInfeasibilities(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    double result = 0;
-// cannot find names in Cbc, Osi, or OsiClp
-//tbd  result = model->model_->sumDualInfeasibilities();
-    if (VERBOSE > 0) printf("%s WARNING:  NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return %g\n", prefix, result);
-    return result;
-}
-/* Number of dual infeasibilities */
-COINLIBAPI int COINLINKAGE
-Cbc_numberDualInfeasibilities(Cbc_Model * /*model*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_numberDualInfeasibilities(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-// cannot find names in Cbc, Osi, or OsiClp
-//tbd  result = model->model_->numberDualInfeasibilities();
-    if (VERBOSE > 0) printf("%s WARNING:  NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-/* Sum of primal infeasibilities */
-COINLIBAPI double COINLINKAGE
-Cbc_sumPrimalInfeasibilities(Cbc_Model * /*model*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_sumPrimalInfeasibilities(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    double result = 0;
-// cannot find names in Cbc, Osi, or OsiClp
-//tbd result = model->model_->sumPrimalInfeasibilities();
-    if (VERBOSE > 0) printf("%s WARNING:  NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return %g\n", prefix, result);
-    return result;
-}
-/* Number of primal infeasibilities */
-COINLIBAPI int COINLINKAGE
-Cbc_numberPrimalInfeasibilities(Cbc_Model * /*model*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_numberPrimalInfeasibilities(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-//tbd  result = model->model_->getContinuousInfeasibilities();
-    if (VERBOSE > 0) printf("%s WARNING:  NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-/* Save model to file, returns 0 if success.  This is designed for
-   use outside algorithms so does not save iterating arrays etc.
-   It does not save any messaging information.
-   Does not save scaling values.
-   It does not know about all types of virtual functions.
-*/
-COINLIBAPI int COINLINKAGE
-Cbc_saveModel(Cbc_Model * /*model*/, const char * /*fileName*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_saveModel(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-// there is a writeMPS method in Osi
-//tbd  result = model->model_->saveModel(fileName);
-    if (VERBOSE > 0) printf("%s WARNING:  NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-/* Restore model from file, returns 0 if success,
-   deletes current model */
-COINLIBAPI int COINLINKAGE
-Cbc_restoreModel(Cbc_Model * /*model*/, const char * /*fileName*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_restoreModel(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-// there is a readMPS method in Osi
-//tbd  result = model->model_->restoreModel(fileName);
-    if (VERBOSE > 0) printf("%s WARNING:  NOT IMPLEMENTED\n", prefix);
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-
-/** Call this to really test if a valid solution can be feasible
-    Solution is number columns in size.
-    If fixVariables true then bounds of continuous solver updated.
-    Returns objective value (worse than cutoff if not feasible)
-*/
-COINLIBAPI void COINLINKAGE
-Cbc_checkSolution(Cbc_Model * /*model*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_checkSolution(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    // see CbcModel::checkSolution(double cutoff, const double * solution,
-    //	       bool fixVariables);
-//  model->model_->checkSolution();
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-    return;
-}
-/* Number of rows */
-COINLIBAPI int COINLINKAGE
-Cbc_getNumRows(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_getNumRows(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-    result = model->model_->getNumRows();
-
-    if (VERBOSE > 0) printf("%s return %d\n", prefix, result);
-    return result;
-}
-/* Number of columns */
-COINLIBAPI int COINLINKAGE
-Cbc_getNumCols(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_getNumCols(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-    result = model->model_->getNumCols();
-
-    if (VERBOSE > 0) printf("%s return %d\n", prefix, result);
-    return result;
-}
-/* Number of iterations */
-COINLIBAPI int COINLINKAGE
-Cbc_getIterationCount(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_getIterationCount(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-    result = model->model_->getIterationCount();
-
-    if (VERBOSE > 0) printf("%s return %d\n", prefix, result);
-    return result;
-}
-/* Are there a numerical difficulties? */
-COINLIBAPI int COINLINKAGE
-Cbc_isAbandoned(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_isAbandoned(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-    result = model->model_->isAbandoned() ? 1 : 0;
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-/* Is optimality proven? */
-COINLIBAPI int COINLINKAGE
-Cbc_isProvenOptimal(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_isProvenOptimal(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-    result = model->model_->isProvenOptimal() ? 1 : 0;
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-/* Is primal infeasiblity proven? */
-COINLIBAPI int COINLINKAGE
-Cbc_isProvenPrimalInfeasible(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_isProvenPrimalInfeasible(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-    OsiSolverInterface * solver = model->model_->solver();
-    result = solver->isProvenPrimalInfeasible() ? 1 : 0;
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-/* Is dual infeasiblity proven? */
-COINLIBAPI int COINLINKAGE
-Cbc_isProvenDualInfeasible(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_isProvenDualInfeasible(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-    OsiSolverInterface * solver = model->model_->solver();
-    result = solver->isProvenDualInfeasible() ? 1 : 0;
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-/* Is the given primal objective limit reached? */
-COINLIBAPI int COINLINKAGE
-Cbc_isPrimalObjectiveLimitReached(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_isPrimalObjectiveLimitReached(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-    OsiSolverInterface * solver = model->model_->solver();
-    result = solver->isPrimalObjectiveLimitReached() ? 1 : 0;
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-/* Is the given dual objective limit reached? */
-COINLIBAPI int COINLINKAGE
-Cbc_isDualObjectiveLimitReached(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_isDualObjectiveLimitReached(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-    OsiSolverInterface * solver = model->model_->solver();
-    result = solver->isDualObjectiveLimitReached() ? 1 : 0;
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-/* Iteration limit reached? */
-COINLIBAPI int COINLINKAGE
-Cbc_isIterationLimitReached(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_isIterationLimitReached(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-    OsiSolverInterface * solver = model->model_->solver();
-    result = solver->isIterationLimitReached() ? 1 : 0;
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-/* Direction of optimization (1 - minimize, -1 - maximize, 0 - ignore */
-COINLIBAPI double COINLINKAGE
-Cbc_getObjSense(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_getObjSense(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    double result = 0;
-    result = model->model_->getObjSense();
-
-    if (VERBOSE > 0) printf("%s return %g\n", prefix, result);
-    return result;
-}
-/* Primal row solution */
-COINLIBAPI const double * COINLINKAGE
-Cbc_getRowActivity(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_getRowActivity(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    const double * result = NULL;
-    result = model->model_->getRowActivity();
-
-    if (VERBOSE > 0)
-        printf("%s return %p\n", prefix, static_cast<const void*>(result));
-    return result;
-}
-/* Primal column solution */
-COINLIBAPI const double * COINLINKAGE
-Cbc_getColSolution(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_getColSolution(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    const double * result = NULL;
-    result = model->model_->getColSolution();
-
-    if (VERBOSE > 0)
-        printf("%s return %p\n", prefix, static_cast<const void*>(result));
-    return result;
-}
-COINLIBAPI void COINLINKAGE
-Cbc_setColSolution(Cbc_Model * model, const double * input)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_setColSolution(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    OsiSolverInterface * solver = model->model_->solver();
-    solver->setColSolution(input);
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-    return;
-}
-/* Dual row solution */
-COINLIBAPI const double * COINLINKAGE
-Cbc_getRowPrice(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_getRowPrice(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    const double * result = NULL;
-    result = model->model_->getRowPrice();
-
-    if (VERBOSE > 0)
-        printf("%s return %p\n", prefix, static_cast<const void*>(result));
-    return result;
-}
-/* Reduced costs */
-COINLIBAPI const double * COINLINKAGE
-Cbc_getReducedCost(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_getReducedCost(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    const double * result = NULL;
-    result = model->model_->getReducedCost();
-
-    if (VERBOSE > 0)
-        printf("%s return %p\n", prefix, static_cast<const void*>(result));
-    return result;
-}
-/* Row lower */
-COINLIBAPI const double * COINLINKAGE
-Cbc_getRowLower(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_getRowLower(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    const double * result = NULL;
-    result = model->model_->getRowLower();
-
-    if (VERBOSE > 0)
-        printf("%s return %p\n", prefix, static_cast<const void*>(result));
-    return result;
-}
-/* Row upper  */
-COINLIBAPI const double * COINLINKAGE
-Cbc_getRowUpper(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_getRowUpper(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    const double * result = NULL;
-    result = model->model_->getRowUpper();
-
-    if (VERBOSE > 0)
-        printf("%s return %p\n", prefix, static_cast<const void*>(result));
-    return result;
-}
-/* Objective Coefficients */
-COINLIBAPI const double * COINLINKAGE
-Cbc_getObjCoefficients(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_getObjCoefficients(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    const double * result = NULL;
-    result = model->model_->getObjCoefficients();
-
-    if (VERBOSE > 0)
-        printf("%s return %p\n", prefix, static_cast<const void*>(result));
-    return result;
-}
-/* Column Lower */
-COINLIBAPI const double * COINLINKAGE
-Cbc_getColLower(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_getColLower(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    const double * result = NULL;
-    result = model->model_->getColLower();
-
-    if (VERBOSE > 0)
-        printf("%s return %p\n", prefix, static_cast<const void*>(result));
-    return result;
-}
-/* Column Upper */
-COINLIBAPI const double * COINLINKAGE
-Cbc_getColUpper(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_getColUpper(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    const double * result = NULL;
-    result = model->model_->getColUpper();
-
-    if (VERBOSE > 0)
-        printf("%s return %p\n", prefix, static_cast<const void*>(result));
-    return result;
-}
-/* Objective value */
-COINLIBAPI double COINLINKAGE
-Cbc_getObjValue(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_getObjValue(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    double result = 0;
-    result = model->model_->getObjValue();
-
-    if (VERBOSE > 0)
-        printf("%s return %g\n", prefix, result);
-    return result;
-}
-/* Print model */
-COINLIBAPI void COINLINKAGE
-Cbc_printModel(Cbc_Model * model, const char * argPrefix)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_printModel(): ";
-    const int  VERBOSE = 4;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    CbcModel *cbc_model = model->model_;
-    int numrows    = cbc_model->getNumRows();
-    int numcols    = cbc_model->getNumCols();
-    int numelem    = cbc_model->getNumElements();
-    const CoinPackedMatrix * matrix = cbc_model->solver()->getMatrixByCol();
-    const CoinBigIndex     * start  = matrix->getVectorStarts();
-    const int              * index  = matrix->getIndices();
-    const double           * value  = matrix->getElements();
-    const double           * collb  = cbc_model->getColLower();
-    const double           * colub  = cbc_model->getColUpper();
-    const double           * obj    = cbc_model->getObjCoefficients();
-    const double           * rowlb  = cbc_model->getRowLower();
-    const double           * rowub  = cbc_model->getRowUpper();
-
-    printf("%s numcols = %i, numrows = %i, numelem = %i\n",
-           argPrefix, numcols, numrows, numelem);
-    printf("%s model = %p, start = %p, index = %p, value = %p\n",
-           argPrefix, static_cast<void*>(model), static_cast<const void*>(start),
-           static_cast<const void*>(index), static_cast<const void*>(value));
-    matrix->dumpMatrix(NULL);
-    {
-        int i;
-        for (i = 0; i <= numcols; i++)
-            printf("%s start[%i] = %i\n", argPrefix, i, start[i]);
-        for (i = 0; i < numelem; i++)
-            printf("%s index[%i] = %i, value[%i] = %g\n",
-                   argPrefix, i, index[i], i, value[i]);
-    }
-
-    printf("%s collb = %p, colub = %p, obj = %p, rowlb = %p, rowub = %p\n",
-           argPrefix, static_cast<const void*>(collb),
-           static_cast<const void*>(colub), static_cast<const void*>(obj),
-           static_cast<const void*>(rowlb), static_cast<const void*>(rowub));
-    printf("%s optimization direction = %g\n", argPrefix, Cbc_optimizationDirection(model));
-    printf("  (1 - minimize, -1 - maximize, 0 - ignore)\n");
-    {
-        int i;
-        for (i = 0; i < numcols; i++)
-            printf("%s collb[%i] = %g, colub[%i] = %g, obj[%i] = %g\n",
-                   argPrefix, i, collb[i], i, colub[i], i, obj[i]);
-        for (i = 0; i < numrows; i++)
-            printf("%s rowlb[%i] = %g, rowub[%i] = %g\n",
-                   argPrefix, i, rowlb[i], i, rowub[i]);
-    }
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-}  // Cbc_printModel()
-
-COINLIBAPI int COINLINKAGE
-Cbc_isInteger(Cbc_Model * model, int i)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_isInteger(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    bool result = false;
-    result = model->model_->isInteger(i);
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return (result) ? 1 : 0;
-}
-
-COINLIBAPI double COINLINKAGE
-Cbc_cpuTime(Cbc_Model * /*model*/)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_cpuTime(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    double result = 0;
-    result = CoinCpuTime() ;
-
-    if (VERBOSE > 0) printf("%s return %g\n", prefix, result);
-    return result;
-}
-/** Number of nodes explored in B&B tree */
-COINLIBAPI int COINLINKAGE
-Cbc_getNodeCount(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_getNodeCount(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    int result = 0;
-    result = model->model_->getNodeCount() ;
-
-    if (VERBOSE > 0) printf("%s return %i\n", prefix, result);
-    return result;
-}
-/** Return a copy of this model */
-COINLIBAPI Cbc_Model * COINLINKAGE
-Cbc_clone(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_clone(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    Cbc_Model * result = new Cbc_Model;
-    result->model_     = new CbcModel(*(model->model_));
-    result->solver_    = dynamic_cast< OsiClpSolverInterface*> (result->model_->solver());
-    result->handler_   = NULL;
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-    return model;
-}
-/** Set this the variable to be continuous */
-COINLIBAPI Cbc_Model * COINLINKAGE
-Cbc_setContinuous(Cbc_Model * model, int iColumn)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_setContinuous(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    model->model_->solver()->setContinuous(iColumn);
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-    return model;
-}
-/* Add an SOS constraint to the model */
-COINLIBAPI void  COINLINKAGE
-Cbc_addSOS_Dense(Cbc_Model * model, int numObjects, const int * len,
-                 const int * const* which, const double * weights, const int type)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_addSOS_Dense(): ";
-//  const int  VERBOSE = 2;
-    if (VERBOSE > 0) printf("%sbegin\n", prefix);
-
-    assert(1 > 0);// this is probably broken
-    int i, j;
-    // I think this is a different model due to overriding = operator
-    CbcModel m = *(model->model_);
-
-    CbcObject ** objects = new CbcObject * [numObjects];
-
-    if (VERBOSE > 1) printf("%s numObjects = %i\n", prefix, numObjects);
-    for (i = 0; i < numObjects; i++) {
-        if (VERBOSE > 1) {
-            printf("%s len[%i] = %i, identifier = %i, type = %i\n",
-                   prefix, i, len[i], i, type);
-            fflush(stdout);
-            for (j = 0; j < len[i]; j++) {
-                if (VERBOSE > 2 || j == 0 || j == (len[i] - 1)) {
-                    printf("%s which[%i][%i] = %d, weights[%i] = %g\n",
-                           prefix, i, j, which[i][j], j, weights[j]);
-                    fflush(stdout);
-                }
-            }
-        }
-
-        // Make a CbcSOS and assign it to objects
-        if (VERBOSE > 1) printf("%s len[%i] = %i\n", prefix, i, len[i]);
-        if (VERBOSE > 1) printf("%s new CbcSOS()\n", prefix);
-        // ***
-        objects[i] = new CbcSOS(model->model_, (int)(len[i]),
-                                (const int*)which[i], (const double*)weights, (int)i, (int)type);
-        // ***
-        if (objects[i] == NULL) {
-            printf("%s ERROR: objects[%i] == NULL\n", prefix, i);
-            fflush(stdout);
-            assert(objects[i] != NULL);
-        }
-    }
-    if (VERBOSE > 1) printf("%s calling addObjects()\n", prefix);
-    fflush(stdout);
-    model->model_->addObjects(numObjects, objects);
-    if (VERBOSE > 1) printf("%s finished addObjects()\n", prefix);
-
-    for (i = 0; i < numObjects; i++) delete objects[i];
-    delete [] objects;
-
-    if (VERBOSE > 0) printf("%sreturn\n", prefix);
-    return;
-}
-/** Add SOS constraints to the model using row-order matrix */
-COINLIBAPI void  COINLINKAGE
-Cbc_addSOS_Sparse(Cbc_Model * model, const int * rowStarts,
-                  const int * rowIndices, const double * weights, const int type)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_addSOS_Sparse(): ";
-//  const int  VERBOSE = 1;
-    if (VERBOSE > 0) printf("%sbegin\n", prefix);
-
-    int numRows = Cbc_numberRows(model);
-    if (VERBOSE > 0) printf("%s numRows = %i\n", prefix, numRows);
-
-    // The passed sparse matrix must have the same number of rows as the model
-    assert(numRows == Cbc_numberRows(model));
-
-    int row, i;
-    const int *colIndex;
-    const double *colWeight;
-
-    // loop on rows and count number of objects according to numWeights>0
-    int numObjects = 0;
-    for (row = 0; row < numRows; row++) {
-        if (VERBOSE > 2) {
-            printf("%s row = %i\n", prefix, row);
-            printf("%s rowStarts[%i] = %i\n", prefix, row, rowStarts[row]);
-            printf("%s rowStarts[%i+1] = %i\n", prefix, row, rowStarts[row+1]);
-            fflush(stdout);
-        }
-        const int numWeights = rowStarts[row+1] - rowStarts[row];
-        if (VERBOSE > 2) printf("%s  numWeights = %i\n", prefix, numWeights);
-        if (numWeights > 0) numObjects++;
-    }
-
-    // make objects
-    CbcObject ** objects = new CbcObject * [numObjects];
-//  if (VERBOSE>1) printf("%s numObjects = %i, objects = %X\n",prefix,numObjects,objects);
-
-    // loop on rows and make an object when numWeights>0
-    int objNum = 0;
-    for (row = 0; row < numRows; row++) {
-        if (VERBOSE > 2) {
-            printf("%s row = %i\n", prefix, row);
-            printf("%s rowStarts[%i] = %i\n", prefix, row, rowStarts[row]);
-            printf("%s rowStarts[%i+1] = %i\n", prefix, row, rowStarts[row+1]);
-        }
-        const int numWeights = rowStarts[row+1] - rowStarts[row];
-        if (VERBOSE > 2) printf("%s  numWeights = %i\n", prefix, numWeights);
-        colIndex    = rowIndices + rowStarts[row];
-        colWeight   = weights + rowStarts[row];
-        if (numWeights > 0) {
-            // Make a CbcSOS and assign it to objects
-            if (VERBOSE > 3) {
-                for (i = 0; i < numWeights; i++) {
-                    printf("%s  colIndex [%i] = %i\n", prefix, i, colIndex[i]);
-                    printf("%s  colWeight[%i] = %f\n", prefix, i, colWeight[i]);
-                }
-                fflush(stdout);
-            }
-            objects[objNum] = new CbcSOS(model->model_, (int)(numWeights),
-                                         (const int*)colIndex, (const double*)colWeight, (int)objNum, (int)type);
-//      if (VERBOSE>2) printf("%s objects[%i] = %X\n",prefix,objNum,objects[objNum]);
-            if (objects[objNum] == NULL) {
-                printf("%s ERROR: objects[%i] == NULL\n", prefix, objNum);
-                fflush(stdout);
-                assert(objects[objNum] != NULL);
-            }
-            objNum++;
-        }
-    }
-    if (VERBOSE > 2) {
-        printf("%s calling addObjects()\n", prefix);
-        /*
-            printf("%s numObjects = %i, objects = %X\n",prefix,numObjects,objects);
-            for (row=0; row<numObjects; row++)
-              printf("%s  objects[%i] = %X\n",prefix,row,objects[row]);
-        */
-    }
-    fflush(stdout);
-    model->model_->addObjects(numObjects, objects);
-    if (VERBOSE > 1) printf("%s finished addObjects()\n", prefix);
-
-    for (objNum = 0; objNum < numObjects; objNum++) delete objects[objNum];
-    delete [] objects;
-
-    if (VERBOSE > 0) printf("%sreturn\n", prefix);
-    return;
-}
-
-/** Delete all object information */
-COINLIBAPI void  COINLINKAGE
-Cbc_deleteObjects(Cbc_Model * model)
-{
-    const char prefix[] = "Cbc_C_Interface::Cbc_deleteObjects(): ";
-//  const int  VERBOSE = 2;
-    if (VERBOSE > 0) printf("%s begin\n", prefix);
-
-    model->model_->deleteObjects();
-
-    if (VERBOSE > 0) printf("%s return\n", prefix);
-    return;
-}
-
-/** Print the solution */
-COINLIBAPI void  COINLINKAGE
-Cbc_printSolution(Cbc_Model * model)
-{
-    {
-        //
-        //  Now to print out row solution.  The methods used return const
-        //  pointers - which is of course much more virtuous.
-        //
-        //  This version just does non-zero columns
-        //
-
-        // * Rows
-
-        int numberRows = Cbc_getNumRows(model);
-        int iRow;
-
-
-        const double * rowPrimal = Cbc_getRowActivity(model);
-        // * Alternatively getReducedCost(model)
-        const double * rowDual = Cbc_getRowPrice(model);
-        // * Alternatively getColLower(model)
-        const double * rowLower = Cbc_getRowLower(model);
-        // * Alternatively getColUpper(model)
-        const double * rowUpper = Cbc_getRowUpper(model);
-        printf("--------------------------------------\n");
-
-        // * If we have not kept names (parameter to readMps) this will be 0
-        //    assert(Cbc_lengthNames(model));
-
-        printf("                       Primal          Dual         Lower         Upper\n");
-        for (iRow = 0; iRow < numberRows; iRow++) {
-            double value;
-            value = rowPrimal[iRow];
-            if (value > 1.0e-8 || value < -1.0e-8) {
-                char name[20];
-                //      	Cbc_columnName(model,iColumn,name);
-                sprintf(name, "ROW%5i", iRow);
-                printf("%6d %8s", iRow, name);
-                printf(" %13g", rowPrimal[iRow]);
-                printf(" %13g", rowDual[iRow]);
-                printf(" %13g", rowLower[iRow]);
-                printf(" %13g", rowUpper[iRow]);
-                printf("\n");
-            }
-        }
-        printf("--------------------------------------\n");
-    }
-    {
-        //
-        //  Now to print out column solution.  The methods used return const
-        //  pointers - which is of course much more virtuous.
-        //
-        //  This version just does non-zero columns
-        //
-        //
-
-        // * Columns
-
-        int numberColumns = Cbc_numberColumns(model);
-        int iColumn;
-
-
-        // * Alternatively getColSolution(model)
-        const double * columnPrimal = Cbc_getColSolution(model);
-        // * Alternatively getReducedCost(model)
-        const double * columnDual = Cbc_getReducedCost(model);
-        // * Alternatively getColLower(model)
-        const double * columnLower = Cbc_getColLower(model);
-        // * Alternatively getColUpper(model)
-        const double * columnUpper = Cbc_getColUpper(model);
-        // * Alternatively getObjCoefficients(model)
-        const double * columnObjective = Cbc_getObjCoefficients(model);
-
-        const char * isInteger = Cbc_integerInformation(model);
-
-        printf("--------------------------------------\n");
-
-        // * If we have not kept names (parameter to readMps) this will be 0
-//    assert(Cbc_lengthNames(model));
-
-        printf("                       Primal          Dual         Lower         Upper          Cost     isInteger\n");
-        for (iColumn = 0; iColumn < numberColumns; iColumn++) {
-            double value;
-            value = columnPrimal[iColumn];
-            if (value > 1.0e-8 || value < -1.0e-8) {
-                char name[20];
-//      	Cbc_columnName(model,iColumn,name);
-                sprintf(name, "COL%5i", iColumn);
-                printf("%6d %8s", iColumn, name);
-                printf(" %13g", columnPrimal[iColumn]);
-                printf(" %13g", columnDual[iColumn]);
-                printf(" %13g", columnLower[iColumn]);
-                printf(" %13g", columnUpper[iColumn]);
-                printf(" %13g", columnObjective[iColumn]);
-                printf(" %13i", isInteger[iColumn]);
-                printf("\n");
-            }
-        }
-        printf("--------------------------------------\n");
-    }
-    if (0) Cbc_printModel(model, "cbc::main(): ");
-    return;
-}
-/** Dual initial solve */
-COINLIBAPI int COINLINKAGE
-Cbc_initialDualSolve(Cbc_Model * /*model*/)
-{
-    return 0;
-}
-/** Primal initial solve */
-COINLIBAPI int COINLINKAGE
-Cbc_initialPrimalSolve(Cbc_Model * /*model*/)
-{
-    return 0;
-}
-/** Dual algorithm - see ClpSimplexDual.hpp for method */
-COINLIBAPI int COINLINKAGE
-Cbc_dual(Cbc_Model * /*model*/, int /*ifValuesPass*/)
-{
-    return 0;
-}
-/** Primal algorithm - see ClpSimplexPrimal.hpp for method */
-COINLIBAPI int COINLINKAGE
-Cbc_primal(Cbc_Model * /*model*/, int /*ifValuesPass*/)
-{
-    return 0;
-}
-#if defined(__MWERKS__)
-#pragma export off
-#endif
-
diff --git a/cbits/coin/Cbc_ampl.cpp b/cbits/coin/Cbc_ampl.cpp
deleted file mode 100644
--- a/cbits/coin/Cbc_ampl.cpp
+++ /dev/null
@@ -1,1512 +0,0 @@
-/* $Id: Cbc_ampl.cpp 1926 2013-05-24 10:19:49Z stefan $ */
-/****************************************************************
-Copyright (C) 1997-2000 Lucent Technologies
-Modifications for Coin -  Copyright (C) 2006, International Business Machines Corporation and others.
-All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and
-its documentation for any purpose and without fee is hereby
-granted, provided that the above copyright notice appear in all
-copies and that both that the copyright notice and this
-permission notice and warranty disclaimer appear in supporting
-documentation, and that the name of Lucent or any of its entities
-not be used in advertising or publicity pertaining to
-distribution of the software without specific, written prior
-permission.
-
-LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
-INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
-IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
-SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
-IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
-THIS SOFTWARE.
-****************************************************************/
-
-/*! \file Cbc_ampl.cpp
-
-  Interface routines for AMPL.
-*/
-
-#include "CbcConfig.h"
-
-#ifdef COIN_HAS_ASL
-
-#ifdef HAVE_UNISTD_H
-# include "unistd.h"
-#endif
-#include "CoinUtilsConfig.h"
-#include "CoinHelperFunctions.hpp"
-#include "CoinModel.hpp"
-#include "CoinSort.hpp"
-#include "CoinPackedMatrix.hpp"
-#include "CoinMpsIO.hpp"
-#include "CoinFloatEqual.hpp"
-#ifdef COIN_HAS_CLP
-#include "OsiClpSolverInterface.hpp"
-#endif
-#include "Cbc_ampl.h"
-extern "C" {
-# include "getstub.h"
-# include "asl_pfgh.h"
-}
-
-#include <string>
-#include <cassert>
-/* so decodePhrase and clpCheck can access */
-static ampl_info * saveInfo = NULL;
-// Set to 1 if algorithm found
-static char algFound[20] = "";
-static char*
-checkPhrase(Option_Info *oi, keyword *kw, char *v)
-{
-    if (strlen(v))
-        printf("string %s\n", v);
-    // Say algorithm found
-    strcpy(algFound, kw->desc);
-    return v;
-}
-static char*
-checkPhrase2(Option_Info *oi, keyword *kw, char *v)
-{
-    if (strlen(v))
-        printf("string %s\n", v);
-    // put out keyword
-    saveInfo->arguments = (char **) realloc(saveInfo->arguments, (saveInfo->numberArguments + 1) * sizeof(char *));
-    saveInfo->arguments[saveInfo->numberArguments++] = strdup(kw->desc);
-    return v;
-}
-static fint
-decodePhrase(char * phrase, ftnlen length)
-{
-    char * blank = strchr(phrase, ' ');
-    if (blank) {
-        /* split arguments */
-        *blank = '\0';
-        saveInfo->arguments = (char **) realloc(saveInfo->arguments, (saveInfo->numberArguments + 2) * sizeof(char *));
-        saveInfo->arguments[saveInfo->numberArguments++] = strdup(phrase);
-        *blank = ' ';
-        phrase = blank + 1; /* move on */
-        if (strlen(phrase))
-            saveInfo->arguments[saveInfo->numberArguments++] = strdup(phrase);
-    } else if (strlen(phrase)) {
-        saveInfo->arguments = (char **) realloc(saveInfo->arguments, (saveInfo->numberArguments + 1) * sizeof(char *));
-        saveInfo->arguments[saveInfo->numberArguments++] = strdup(phrase);
-    }
-    return 0;
-}
-static void
-sos_kludge(int nsos, int *sosbeg, double *sosref, int * sosind)
-{
-    // Adjust sosref if necessary to make monotonic increasing
-    int i, j, k;
-    // first sort
-    for (i = 0; i < nsos; i++) {
-        k = sosbeg[i];
-        int end = sosbeg[i+1];
-        CoinSort_2(sosref + k, sosref + end, sosind + k);
-    }
-    double t, t1;
-    for (i = j = 0; i++ < nsos; ) {
-        k = sosbeg[i];
-        t = sosref[j];
-        while (++j < k) {
-            t1 = sosref[j];
-            t += 1e-10;
-            if (t1 <= t)
-                sosref[j] = t1 = t + 1e-10;
-            t = t1;
-        }
-    }
-}
-static char xxxxxx[20];
-#define VP (char*)
-static keyword keywds[] = { /* must be sorted */
-    { const_cast<char*>("barrier"),  checkPhrase,  (char *) xxxxxx ,
-        const_cast<char*>("-barrier")},
-    { const_cast<char*>("dual"),     checkPhrase,  (char *) xxxxxx ,
-      const_cast<char*>("-dualsimplex")},
-    { const_cast<char*>("help"),     checkPhrase2, (char *) xxxxxx ,
-      const_cast<char*>("-?")},
-    { const_cast<char*>("initial"),  checkPhrase,  (char *) xxxxxx ,
-      const_cast<char*>("-initialsolve")},
-    { const_cast<char*>("max"),      checkPhrase2, (char *) xxxxxx ,
-      const_cast<char*>("-maximize")},
-    { const_cast<char*>("maximize"), checkPhrase2, (char *) xxxxxx ,
-      const_cast<char*>("-maximize")},
-    { const_cast<char*>("primal"),   checkPhrase,  (char *) xxxxxx ,
-      const_cast<char*>("-primalsimplex")},
-    { const_cast<char*>("quit"),     checkPhrase2, (char *) xxxxxx ,
-      const_cast<char*>("-quit")},
-    { const_cast<char*>("wantsol"),  WS_val,       NULL,
-      const_cast<char*>("write .sol file (without -AMPL)")}
-};
-static Option_Info Oinfo = {
-    const_cast<char*>("cbc"),
-    const_cast<char*>("CBC " CBC_VERSION),
-    const_cast<char*>("cbc_options"),
-    keywds,
-    nkeywds,
-    0,
-    0,
-    0,
-    decodePhrase,
-    0,
-    0,
-    0,
-    20130502
-};
-// strdup used to avoid g++ compiler warning
-static SufDecl suftab[] = {
-#ifdef JJF_ZERO
-    { const_cast<char*>("current"), 0, ASL_Sufkind_con | ASL_Sufkind_outonly },
-    { const_cast<char*>("current"), 0, ASL_Sufkind_var | ASL_Sufkind_outonly },
-    { const_cast<char*>("direction"), 0, ASL_Sufkind_var },
-    { const_cast<char*>("down"), 0, ASL_Sufkind_con | ASL_Sufkind_outonly },
-    { const_cast<char*>("down"), 0, ASL_Sufkind_var | ASL_Sufkind_outonly },
-    { const_cast<char*>("priority"), 0, ASL_Sufkind_var },
-#endif
-    { const_cast<char*>("cut"), 0, ASL_Sufkind_con },
-    { const_cast<char*>("direction"), 0, ASL_Sufkind_var },
-    { const_cast<char*>("downPseudocost"), 0, ASL_Sufkind_var | ASL_Sufkind_real },
-    { const_cast<char*>("priority"), 0, ASL_Sufkind_var },
-    { const_cast<char*>("ref"), 0, ASL_Sufkind_var | ASL_Sufkind_real },
-    { const_cast<char*>("sos"), 0, ASL_Sufkind_var },
-    { const_cast<char*>("sos"), 0, ASL_Sufkind_con },
-    { const_cast<char*>("sosno"), 0, ASL_Sufkind_var | ASL_Sufkind_real },
-    { const_cast<char*>("sosref"), 0, ASL_Sufkind_var | ASL_Sufkind_real },
-    { const_cast<char*>("special"), 0, ASL_Sufkind_var },
-    { const_cast<char*>("special"), 0, ASL_Sufkind_con },
-    /*{ const_cast<char*>("special"), 0, ASL_Sufkind_con },*/
-    { const_cast<char*>("sstatus"), 0, ASL_Sufkind_var, 0 },
-    { const_cast<char*>("sstatus"), 0, ASL_Sufkind_con, 0 },
-    { const_cast<char*>("upPseudocost"), 0, ASL_Sufkind_var | ASL_Sufkind_real }
-#ifdef JJF_ZERO
-    { const_cast<char*>("unbdd"), 0, ASL_Sufkind_var | ASL_Sufkind_outonly},
-    { const_cast<char*>("up"), 0, ASL_Sufkind_con | ASL_Sufkind_outonly },
-    { const_cast<char*>("up"), 0, ASL_Sufkind_var | ASL_Sufkind_outonly }
-#endif
-};
-#include "float.h"
-#include "limits.h"
-static ASL *asl = NULL;
-static FILE *nl = NULL;
-
-static void
-mip_stuff(void)
-{
-    int i;
-    double *pseudoUp, *pseudoDown;
-    int *priority, *direction;
-    // To label cuts (there will be other uses for special)
-    int *cut;
-    // To label special variables - at present 1= must be >= 1 or <= -1
-    int * special;
-    SufDesc *dpup, *dpdown, *dpri, *ddir, *dcut, *dspecial;
-
-    ddir = suf_get("direction", ASL_Sufkind_var);
-    direction = ddir->u.i;
-    dpri = suf_get("priority", ASL_Sufkind_var);
-    priority = dpri->u.i;
-    dspecial = suf_get("special", ASL_Sufkind_con);
-    dcut = suf_get("cut", ASL_Sufkind_con);
-    cut = dcut->u.i;
-    if (!cut) {
-        // try special
-        dcut = suf_get("special", ASL_Sufkind_con);
-        cut = dcut->u.i;
-    }
-    dspecial = suf_get("special", ASL_Sufkind_var);
-    special = dspecial->u.i;
-    dpdown = suf_get("downPseudocost", ASL_Sufkind_var);
-    pseudoDown = dpdown->u.r;
-    dpup = suf_get("upPseudocost", ASL_Sufkind_var);
-    pseudoUp = dpup->u.r;
-    assert(saveInfo);
-    int numberColumns = saveInfo->numberColumns;
-    if (direction) {
-        int baddir = 0;
-        saveInfo->branchDirection = (int *) malloc(numberColumns * sizeof(int));
-        for (i = 0; i < numberColumns; i++) {
-            int value = direction[i];
-            if (value < -1 || value > 1) {
-                baddir++;
-                value = 0;
-            }
-            saveInfo->branchDirection[i] = value;
-        }
-        if (baddir)
-            fprintf(Stderr,
-                    "Treating %d .direction values outside [-1, 1] as 0.\n",
-                    baddir);
-    }
-    if (priority) {
-        int badpri = 0;
-        saveInfo->priorities = (int *) malloc(numberColumns * sizeof(int));
-        for (i = 0; i < numberColumns; i++) {
-            int value = priority[i];
-            if (value < 0) {
-                badpri++;
-                value = 0;
-            }
-            saveInfo->priorities[i] = value;
-        }
-        if (badpri)
-            fprintf(Stderr,
-                    "Treating %d negative .priority values as 0\n",
-                    badpri);
-    }
-    if (special) {
-        int badspecial = 0;
-        saveInfo->special = (int *) malloc(numberColumns * sizeof(int));
-        for (i = 0; i < numberColumns; i++) {
-            int value = special[i];
-            if (value < 0) {
-                badspecial++;
-                value = 0;
-            }
-            saveInfo->special[i] = value;
-        }
-        if (badspecial)
-            fprintf(Stderr,
-                    "Treating %d negative special values as 0\n",
-                    badspecial);
-    }
-    int numberRows = saveInfo->numberRows;
-    if (cut) {
-        int badcut = 0;
-        saveInfo->cut = (int *) malloc(numberRows * sizeof(int));
-        for (i = 0; i < numberRows; i++) {
-            int value = cut[i];
-            if (value < 0) {
-                badcut++;
-                value = 0;
-            }
-            saveInfo->cut[i] = value;
-        }
-        if (badcut)
-            fprintf(Stderr,
-                    "Treating %d negative cut values as 0\n",
-                    badcut);
-    }
-    if (pseudoDown || pseudoUp) {
-        int badpseudo = 0;
-        if (!pseudoDown || !pseudoUp)
-            fprintf(Stderr,
-                    "Only one set of pseudocosts - assumed same\n");
-        saveInfo->pseudoDown = (double *) malloc(numberColumns * sizeof(double));
-        saveInfo->pseudoUp = (double *) malloc(numberColumns * sizeof(double));
-        for (i = 0; i < numberColumns; i++) {
-            double valueD = 0.0, valueU = 0.0;
-            if (pseudoDown) {
-                valueD = pseudoDown[i];
-                if (valueD < 0) {
-                    badpseudo++;
-                    valueD = 0.0;
-                }
-            }
-            if (pseudoUp) {
-                valueU = pseudoUp[i];
-                if (valueU < 0) {
-                    badpseudo++;
-                    valueU = 0.0;
-                }
-            }
-            if (!valueD)
-                valueD = valueU;
-            if (!valueU)
-                valueU = valueD;
-            saveInfo->pseudoDown[i] = valueD;
-            saveInfo->pseudoUp[i] = valueU;
-        }
-        if (badpseudo)
-            fprintf(Stderr,
-                    "Treating %d negative pseudoCosts as 0.0\n", badpseudo);
-    }
-}
-static void
-stat_map(int *stat, int n, int *map, int mx, const char *what)
-{
-    int bad, i, i1 = 0, j, j1 = 0;
-    static char badfmt[] = "Coin driver: %s[%d] = %d\n";
-
-    for (i = bad = 0; i < n; i++) {
-        if ((j = stat[i]) >= 0 && j <= mx)
-            stat[i] = map[j];
-        else {
-            stat[i] = 0;
-            i1 = i;
-            j1 = j;
-            if (!bad++)
-                fprintf(Stderr, badfmt, what, i, j);
-        }
-    }
-    if (bad > 1) {
-        if (bad == 2)
-            fprintf(Stderr, badfmt, what, i1, j1);
-        else
-            fprintf(Stderr,
-                    "Coin driver: %d messages about bad %s values suppressed.\n",
-                    bad - 1, what);
-    }
-}
-
-int
-readAmpl(ampl_info * info, int argc, char **argv, void ** coinModel)
-{
-    char *stub;
-    ograd *og;
-    int i;
-    SufDesc *csd;
-    SufDesc *rsd;
-    /*bool *basis, *lower;*/
-    /*double *LU, *c, lb, objadj, *rshift, *shift, t, ub, *x, *x0, *x1;*/
-    char * environment = getenv("cbc_options");
-    char tempBuffer[20];
-    double * obj;
-    double * columnLower;
-    double * columnUpper;
-    double * rowLower;
-    double * rowUpper;
-    char ** saveArgv = argv;
-    char fileName[1000];
-    if (argc > 1)
-        strcpy(fileName, argv[1]);
-    else
-        fileName[0] = '\0';
-    int nonLinearType = -1;
-    // testosi parameter - if >= 10 then go in through coinModel
-    for (i = 1; i < argc; i++) {
-        if (!strncmp(argv[i], "testosi", 7)) {
-            char * equals = strchr(argv[i], '=');
-            if (equals && atoi(equals + 1) >= 10 && atoi(equals + 1) <= 20) {
-                nonLinearType = atoi(equals + 1);
-                break;
-            }
-        }
-    }
-    int saveArgc = argc;
-    if (info->numberRows != -1234567)
-        memset(info, 0, sizeof(ampl_info)); // overwrite unless magic number set
-    /* save so can be accessed by decodePhrase */
-    saveInfo = info;
-    info->numberArguments = 0;
-    info->arguments = (char **) malloc(2 * sizeof(char *));
-    info->arguments[info->numberArguments++] = strdup("ampl");
-    info->arguments[info->numberArguments++] = strdup("cbc");
-    asl = ASL_alloc(ASL_read_f);
-    stub = getstub(&argv, &Oinfo);
-    if (!stub)
-        usage_ASL(&Oinfo, 1);
-    nl = jac0dim(stub, 0);
-    suf_declare(suftab, sizeof(suftab) / sizeof(SufDecl));
-
-    /* set A_vals to get the constraints column-wise (malloc so can be freed) */
-    A_vals = (double *) malloc(nzc * sizeof(double));
-    if (!A_vals) {
-        printf("no memory\n");
-        return 1;
-    }
-    /* say we want primal solution */
-    want_xpi0 = 1;
-    /* for basis info */
-    info->columnStatus = (int *) malloc(n_var * sizeof(int));
-    info->rowStatus = (int *) malloc(n_con * sizeof(int));
-    csd = suf_iput("sstatus", ASL_Sufkind_var, info->columnStatus);
-    rsd = suf_iput("sstatus", ASL_Sufkind_con, info->rowStatus);
-    if (!(nlvc + nlvo) && nonLinearType < 10) {
-        /* read linear model*/
-        f_read(nl, 0);
-        // see if any sos
-        if (true) {
-            char *sostype;
-            int nsosnz, *sosbeg, *sosind, * sospri;
-            double *sosref;
-            int nsos;
-            int i = ASL_suf_sos_explict_free;
-            int copri[2], **p_sospri;
-            copri[0] = 0;
-            copri[1] = 0;
-            p_sospri = &sospri;
-            nsos = suf_sos(i, &nsosnz, &sostype, p_sospri, copri,
-                           &sosbeg, &sosind, &sosref);
-            if (nsos) {
-                info->numberSos = nsos;
-                info->sosType = (char *) malloc(nsos);
-                info->sosPriority = (int *) malloc(nsos * sizeof(int));
-                info->sosStart = (int *) malloc((nsos + 1) * sizeof(int));
-                info->sosIndices = (int *) malloc(nsosnz * sizeof(int));
-                info->sosReference = (double *) malloc(nsosnz * sizeof(double));
-                sos_kludge(nsos, sosbeg, sosref, sosind);
-                for (int i = 0; i < nsos; i++) {
-                    char ichar = sostype[i];
-                    assert (ichar == '1' || ichar == '2');
-                    info->sosType[i] = static_cast<char>(ichar - '0');
-                }
-                memcpy(info->sosPriority, sospri, nsos*sizeof(int));
-                memcpy(info->sosStart, sosbeg, (nsos + 1)*sizeof(int));
-                memcpy(info->sosIndices, sosind, nsosnz*sizeof(int));
-                memcpy(info->sosReference, sosref, nsosnz*sizeof(double));
-            }
-        }
-
-        /*sos_finish(&specialOrderedInfo, 0, &j, 0, 0, 0, 0, 0);*/
-        Oinfo.uinfo = tempBuffer;
-        if (getopts(argv, &Oinfo))
-            return 1;
-        /* objective*/
-        obj = (double *) malloc(n_var * sizeof(double));
-        for (i = 0; i < n_var; i++)
-            obj[i] = 0.0;
-        if (n_obj) {
-            for (og = Ograd[0]; og; og = og->next)
-                obj[og->varno] = og->coef;
-        }
-        if (objtype[0])
-            info->direction = -1.0;
-        else
-            info->direction = 1.0;
-        info->offset = objconst(0);
-        /* Column bounds*/
-        columnLower = (double *) malloc(n_var * sizeof(double));
-        columnUpper = (double *) malloc(n_var * sizeof(double));
-        for (i = 0; i < n_var; i++) {
-            columnLower[i] = LUv[2*i];
-            if (columnLower[i] <= negInfinity)
-                columnLower[i] = -COIN_DBL_MAX;
-            columnUpper[i] = LUv[2*i+1];
-            if (columnUpper[i] >= Infinity)
-                columnUpper[i] = COIN_DBL_MAX;
-        }
-        /* Row bounds*/
-        rowLower = (double *) malloc(n_con * sizeof(double));
-        rowUpper = (double *) malloc(n_con * sizeof(double));
-        for (i = 0; i < n_con; i++) {
-            rowLower[i] = LUrhs[2*i];
-            if (rowLower[i] <= negInfinity)
-                rowLower[i] = -COIN_DBL_MAX;
-            rowUpper[i] = LUrhs[2*i+1];
-            if (rowUpper[i] >= Infinity)
-                rowUpper[i] = COIN_DBL_MAX;
-        }
-        info->numberRows = n_con;
-        info->numberColumns = n_var;
-        info->numberElements = nzc;
-        info->numberBinary = nbv;
-        info->numberIntegers = niv + nbv;
-        info->objective = obj;
-        info->rowLower = rowLower;
-        info->rowUpper = rowUpper;
-        info->columnLower = columnLower;
-        info->columnUpper = columnUpper;
-        info->starts = A_colstarts;
-        /*A_colstarts=NULL;*/
-        info->rows = A_rownos;
-        /*A_rownos=NULL;*/
-        info->elements = A_vals;
-        /*A_vals=NULL;*/
-        info->primalSolution = NULL;
-        /* put in primalSolution if exists */
-        if (X0) {
-            info->primalSolution = (double *) malloc(n_var * sizeof(double));
-            memcpy(info->primalSolution, X0, n_var*sizeof(double));
-        }
-        info->dualSolution = NULL;
-        if (niv + nbv > 0)
-            mip_stuff(); // get any extra info
-        if ((!(niv + nbv) && (csd->kind & ASL_Sufkind_input))
-                || (rsd->kind & ASL_Sufkind_input)) {
-            /* convert status - need info on map */
-            static int map[] = {1, 3, 1, 1, 2, 1, 1};
-            stat_map(info->columnStatus, n_var, map, 6, "incoming columnStatus");
-            stat_map(info->rowStatus, n_con, map, 6, "incoming rowStatus");
-        } else {
-            /* all slack basis */
-            // leave status for output */
-#ifdef JJF_ZERO
-            free(info->rowStatus);
-            info->rowStatus = NULL;
-            free(info->columnStatus);
-            info->columnStatus = NULL;
-#endif
-        }
-    } else {
-        // QP
-        // Add .nl if not there
-        if (!strstr(fileName, ".nl"))
-            strcat(fileName, ".nl");
-        CoinModel * model = new CoinModel((nonLinearType > 10) ? 2 : 1, fileName, info);
-        if (model->numberRows() > 0 || model->numberColumns() > 0)
-            *coinModel = (void *) model;
-        Oinfo.uinfo = tempBuffer;
-        if (getopts(argv, &Oinfo))
-            return 1;
-        Oinfo.wantsol = 1;
-        if (objtype[0])
-            info->direction = -1.0;
-        else
-            info->direction = 1.0;
-        model->setOptimizationDirection(info->direction);
-        info->offset = objconst(0);
-        info->numberRows = n_con;
-        info->numberColumns = n_var;
-        info->numberElements = nzc;
-        info->numberBinary = nbv;
-        int numberIntegers = niv + nlvci + nlvoi + nbv;
-        if (nlvci + nlvoi + nlvc + nlvo) {
-            // Non linear
-            // No idea if there are overlaps so compute
-            int numberIntegers = 0;
-            for ( i = 0; i < n_var; i++) {
-                if (model->columnIsInteger(i))
-                    numberIntegers++;
-            }
-        }
-        info->numberIntegers = numberIntegers;
-        // Say nonlinear if it is
-        info->nonLinear = nlvc + nlvo;
-        if (numberIntegers > 0) {
-            mip_stuff(); // get any extra info
-            if (info->cut)
-                model->setCutMarker(info->numberRows, info->cut);
-            if (info->priorities)
-                model->setPriorities(info->numberColumns, info->priorities);
-        }
-    }
-    /* add -solve - unless something there already
-     - also check for sleep=yes */
-    {
-        int found = 0;
-        int foundLog = 0;
-        int foundSleep = 0;
-        const char * something[] = {"solve", "branch", "duals", "primals", "user"};
-        for (i = 0; i < info->numberArguments; i++) {
-            unsigned int j;
-            const char * argument = info->arguments[i];
-            for (j = 0; j < sizeof(something) / sizeof(char *); j++) {
-                const char * check = something[j];
-                if (!strncmp(argument, check, sizeof(check))) {
-                    found = (int)(j + 1);
-                } else if (!strncmp(argument, "log", 3)) {
-                    foundLog = 1;
-                } else if (!strncmp(argument, "sleep", 5)) {
-                    foundSleep = 1;
-                }
-            }
-        }
-        if (foundLog) {
-            /* print options etc */
-            for (i = 0; i < saveArgc; i++)
-                printf("%s ", saveArgv[i]);
-            printf("\n");
-            if (environment)
-                printf("env %s\n", environment);
-            /*printf("%d rows %d columns %d elements\n",n_con,n_var,nzc);*/
-        }
-        if (!found) {
-            if (!strlen(algFound)) {
-                info->arguments = (char **) realloc(info->arguments, (info->numberArguments + 1) * sizeof(char *));
-                info->arguments[info->numberArguments++] = strdup("-solve");
-            } else {
-                // use algorithm from keyword
-                info->arguments = (char **) realloc(info->arguments, (info->numberArguments + 1) * sizeof(char *));
-                info->arguments[info->numberArguments++] = strdup(algFound);
-            }
-        }
-        if (foundSleep) {
-            /* let user copy .nl file */
-            fprintf(stderr, "You can copy .nl file %s for debug purposes or attach debugger\n", saveArgv[1]);
-            fprintf(stderr, "Type q to quit, anything else to continue\n");
-            int getChar = getc(stdin);
-            if (getChar == 'q' || getChar == 'Q')
-                exit(1);
-        }
-    }
-    /* add -quit */
-    info->arguments = (char **) realloc(info->arguments, (info->numberArguments + 1) * sizeof(char *));
-    info->arguments[info->numberArguments++] = strdup("-quit");
-    return 0;
-}
-void freeArrays1(ampl_info * info)
-{
-    free(info->objective);
-    info->objective = NULL;
-    free(info->rowLower);
-    info->rowLower = NULL;
-    free(info->rowUpper);
-    info->rowUpper = NULL;
-    free(info->columnLower);
-    info->columnLower = NULL;
-    free(info->columnUpper);
-    info->columnUpper = NULL;
-    /* this one not freed by ASL_free */
-    free(info->elements);
-    info->elements = NULL;
-    free(info->primalSolution);
-    info->primalSolution = NULL;
-    free(info->dualSolution);
-    info->dualSolution = NULL;
-    /*free(info->rowStatus);
-    info->rowStatus=NULL;
-    free(info->columnStatus);
-    info->columnStatus=NULL;*/
-}
-void freeArrays2(ampl_info * info)
-{
-    free(info->primalSolution);
-    info->primalSolution = NULL;
-    free(info->dualSolution);
-    info->dualSolution = NULL;
-    free(info->rowStatus);
-    info->rowStatus = NULL;
-    free(info->columnStatus);
-    info->columnStatus = NULL;
-    free(info->priorities);
-    info->priorities = NULL;
-    free(info->branchDirection);
-    info->branchDirection = NULL;
-    free(info->pseudoDown);
-    info->pseudoDown = NULL;
-    free(info->pseudoUp);
-    info->pseudoUp = NULL;
-    free(info->sosType);
-    info->sosType = NULL;
-    free(info->sosPriority);
-    info->sosPriority = NULL;
-    free(info->sosStart);
-    info->sosStart = NULL;
-    free(info->sosIndices);
-    info->sosIndices = NULL;
-    free(info->sosReference);
-    info->sosReference = NULL;
-    free(info->cut);
-    info->cut = NULL;
-    ASL_free(&asl);
-}
-void freeArgs(ampl_info * info)
-{
-    int i;
-    for ( i = 0; i < info->numberArguments; i++)
-        free(info->arguments[i]);
-    free(info->arguments);
-}
-int ampl_obj_prec()
-{
-    return obj_prec();
-}
-void writeAmpl(ampl_info * info)
-{
-    char buf[1000];
-    typedef struct {
-        const char *msg;
-        int code;
-        int wantObj;
-    } Sol_info;
-    static Sol_info solinfo[] = {
-        { "optimal solution",			000, 1 },
-        { "infeasible",     			200, 1 },
-        { "unbounded",	        		300, 0 },
-        { "iteration limit etc",			400, 1 },
-        { "solution limit",				401, 1 },
-        { "ran out of space",			500, 0 },
-        { "status unknown",				501, 1 },
-        { "bug!",					502, 0 },
-        { "best MIP solution so far restored",	101, 1 },
-        { "failed to restore best MIP solution",	503, 1 },
-        { "optimal (?) solution",			100, 1 }
-    };
-    /* convert status - need info on map */
-    static int map[] = {0, 3, 4, 1};
-    sprintf(buf, "%s %s", Oinfo.bsname, info->buffer);
-    solve_result_num = solinfo[info->problemStatus].code;
-    if (info->columnStatus) {
-        stat_map(info->columnStatus, n_var, map, 4, "outgoing columnStatus");
-        stat_map(info->rowStatus, n_con, map, 4, "outgoing rowStatus");
-        suf_iput("sstatus", ASL_Sufkind_var, info->columnStatus);
-        suf_iput("sstatus", ASL_Sufkind_con, info->rowStatus);
-    }
-    write_sol(buf, info->primalSolution, info->dualSolution, &Oinfo);
-}
-/* Read a problem from AMPL nl file
- */
-CoinModel::CoinModel( int nonLinear, const char * fileName, const void * info)
-        :  CoinBaseModel(),
-        maximumRows_(0),
-        maximumColumns_(0),
-        numberElements_(0),
-        maximumElements_(0),
-        numberQuadraticElements_(0),
-        maximumQuadraticElements_(0),
-        rowLower_(NULL),
-        rowUpper_(NULL),
-        rowType_(NULL),
-        objective_(NULL),
-        columnLower_(NULL),
-        columnUpper_(NULL),
-        integerType_(NULL),
-        columnType_(NULL),
-        start_(NULL),
-        elements_(NULL),
-        packedMatrix_(NULL),
-        quadraticElements_(NULL),
-        sortIndices_(NULL),
-        sortElements_(NULL),
-        sortSize_(0),
-        sizeAssociated_(0),
-        associated_(NULL),
-        numberSOS_(0),
-        startSOS_(NULL),
-        memberSOS_(NULL),
-        typeSOS_(NULL),
-        prioritySOS_(NULL),
-        referenceSOS_(NULL),
-        priority_(NULL),
-        cut_(NULL),
-        moreInfo_(NULL),
-        type_(-1),
-	noNames_(false),
-        links_(0)
-{
-    problemName_ = "";
-    int status = 0;
-    if (!strcmp(fileName, "-") || !strcmp(fileName, "stdin")) {
-        // stdin
-    } else {
-        std::string name = fileName;
-        bool readable = fileCoinReadable(name);
-        if (!readable) {
-            std::cerr << "Unable to open file "
-                      << fileName << std::endl;
-            status = -1;
-        }
-    }
-    if (!status) {
-        gdb(nonLinear, fileName, info);
-    }
-}
-#ifdef JJF_ZERO
-static real
-qterm(ASL *asl, fint *colq, fint *rowq, real *delsq)
-{
-    double t, t1, *x, *x0, *xe;
-    fint *rq0, *rqe;
-
-    t = 0.;
-    x0 = x = X0;
-    xe = x + n_var;
-    rq0 = rowq;
-    while (x < xe) {
-        t1 = *x++;
-        rqe = rq0 + *++colq;
-        while (rowq < rqe)
-            t += t1 * x0[*rowq++]**delsq++;
-    }
-    return 0.5 * t;
-}
-#endif
-// stolen from IPopt with changes
-typedef struct {
-    double obj_sign_;
-    ASL_pfgh * asl_;
-    double * non_const_x_;
-    int * column_; // for jacobian
-    int * rowStart_;
-    double * gradient_;
-    double * constraintValues_;
-    int nz_h_full_; // number of nonzeros in hessian
-    int nerror_;
-    bool objval_called_with_current_x_;
-    bool conval_called_with_current_x_;
-    bool jacval_called_with_current_x_;
-} CbcAmplInfo;
-
-void
-CoinModel::gdb( int nonLinear, const char * fileName, const void * info)
-{
-    const ampl_info * amplInfo = (const ampl_info *) info;
-    ograd *og = NULL;
-    int i;
-    SufDesc *csd = NULL;
-    SufDesc *rsd = NULL;
-    /*bool *basis, *lower;*/
-    /*double *LU, *c, lb, objadj, *rshift, *shift, t, ub, *x, *x0, *x1;*/
-    //char tempBuffer[20];
-    double * objective = NULL;
-    double * columnLower = NULL;
-    double * columnUpper = NULL;
-    double * rowLower = NULL;
-    double * rowUpper = NULL;
-    int * columnStatus = NULL;
-    int * rowStatus = NULL;
-    int numberRows = -1;
-    int numberColumns = -1;
-    int numberElements = -1;
-    int numberBinary = -1;
-    int numberIntegers = -1;
-    int numberAllNonLinearBoth = 0;
-    int numberIntegerNonLinearBoth = 0;
-    int numberAllNonLinearConstraints = 0;
-    int numberIntegerNonLinearConstraints = 0;
-    int numberAllNonLinearObjective = 0;
-    int numberIntegerNonLinearObjective = 0;
-    double * primalSolution = NULL;
-    double direction = 1.0;
-    char * stub = strdup(fileName);
-    CoinPackedMatrix matrixByRow;
-    fint ** colqp = NULL;
-    int *z = NULL;
-    if (nonLinear == 0) {
-        // linear
-        asl = ASL_alloc(ASL_read_f);
-        nl = jac0dim(stub, 0);
-        free(stub);
-        suf_declare(suftab, sizeof(suftab) / sizeof(SufDecl));
-
-        /* set A_vals to get the constraints column-wise (malloc so can be freed) */
-        A_vals = (double *) malloc(nzc * sizeof(double));
-        if (!A_vals) {
-            printf("no memory\n");
-            return ;
-        }
-        /* say we want primal solution */
-        want_xpi0 = 1;
-        /* for basis info */
-        columnStatus = (int *) malloc(n_var * sizeof(int));
-        rowStatus = (int *) malloc(n_con * sizeof(int));
-        csd = suf_iput("sstatus", ASL_Sufkind_var, columnStatus);
-        rsd = suf_iput("sstatus", ASL_Sufkind_con, rowStatus);
-        /* read linear model*/
-        f_read(nl, 0);
-        // see if any sos
-        if (true) {
-            char *sostype;
-            int nsosnz, *sosbeg, *sosind, * sospri;
-            double *sosref;
-            int nsos;
-            int i = ASL_suf_sos_explict_free;
-            int copri[2], **p_sospri;
-            copri[0] = 0;
-            copri[1] = 0;
-            p_sospri = &sospri;
-            nsos = suf_sos(i, &nsosnz, &sostype, p_sospri, copri,
-                           &sosbeg, &sosind, &sosref);
-            if (nsos) {
-                abort();
-#ifdef JJF_ZERO
-                info->numberSos = nsos;
-                info->sosType = (char *) malloc(nsos);
-                info->sosPriority = (int *) malloc(nsos * sizeof(int));
-                info->sosStart = (int *) malloc((nsos + 1) * sizeof(int));
-                info->sosIndices = (int *) malloc(nsosnz * sizeof(int));
-                info->sosReference = (double *) malloc(nsosnz * sizeof(double));
-                sos_kludge(nsos, sosbeg, sosref, sosind);
-                for (int i = 0; i < nsos; i++) {
-                    int ichar = sostype[i];
-                    assert (ichar == '1' || ichar == '2');
-                    info->sosType[i] = ichar - '0';
-                }
-                memcpy(info->sosPriority, sospri, nsos*sizeof(int));
-                memcpy(info->sosStart, sosbeg, (nsos + 1)*sizeof(int));
-                memcpy(info->sosIndices, sosind, nsosnz*sizeof(int));
-                memcpy(info->sosReference, sosref, nsosnz*sizeof(double));
-#endif
-            }
-        }
-
-        /*sos_finish(&specialOrderedInfo, 0, &j, 0, 0, 0, 0, 0);*/
-        //Oinfo.uinfo = tempBuffer;
-        //if (getopts(argv, &Oinfo))
-        //return 1;
-        /* objective*/
-        objective = (double *) malloc(n_var * sizeof(double));
-        for (i = 0; i < n_var; i++)
-            objective[i] = 0.0;
-        if (n_obj) {
-            for (og = Ograd[0]; og; og = og->next)
-                objective[og->varno] = og->coef;
-        }
-        if (objtype[0])
-            direction = -1.0;
-        else
-            direction = 1.0;
-        objectiveOffset_ = objconst(0);
-        /* Column bounds*/
-        columnLower = (double *) malloc(n_var * sizeof(double));
-        columnUpper = (double *) malloc(n_var * sizeof(double));
-        for (i = 0; i < n_var; i++) {
-            columnLower[i] = LUv[2*i];
-            if (columnLower[i] <= negInfinity)
-                columnLower[i] = -COIN_DBL_MAX;
-            columnUpper[i] = LUv[2*i+1];
-            if (columnUpper[i] >= Infinity)
-                columnUpper[i] = COIN_DBL_MAX;
-        }
-        /* Row bounds*/
-        rowLower = (double *) malloc(n_con * sizeof(double));
-        rowUpper = (double *) malloc(n_con * sizeof(double));
-        for (i = 0; i < n_con; i++) {
-            rowLower[i] = LUrhs[2*i];
-            if (rowLower[i] <= negInfinity)
-                rowLower[i] = -COIN_DBL_MAX;
-            rowUpper[i] = LUrhs[2*i+1];
-            if (rowUpper[i] >= Infinity)
-                rowUpper[i] = COIN_DBL_MAX;
-        }
-        numberRows = n_con;
-        numberColumns = n_var;
-        numberElements = nzc;
-        numberBinary = nbv;
-        numberIntegers = niv;
-        /* put in primalSolution if exists */
-        if (X0) {
-            primalSolution = (double *) malloc(n_var * sizeof(double));
-            memcpy( primalSolution, X0, n_var*sizeof(double));
-        }
-        //double * dualSolution=NULL;
-        if (niv + nbv > 0)
-            mip_stuff(); // get any extra info
-        if ((!(niv + nbv) && (csd->kind & ASL_Sufkind_input))
-                || (rsd->kind & ASL_Sufkind_input)) {
-            /* convert status - need info on map */
-            static int map[] = {1, 3, 1, 1, 2, 1, 1};
-            stat_map(columnStatus, n_var, map, 6, "incoming columnStatus");
-            stat_map(rowStatus, n_con, map, 6, "incoming rowStatus");
-        } else {
-            /* all slack basis */
-            // leave status for output */
-#ifdef JJF_ZERO
-            free(rowStatus);
-            rowStatus = NULL;
-            free(columnStatus);
-            columnStatus = NULL;
-#endif
-        }
-        CoinPackedMatrix columnCopy(true, numberRows, numberColumns, numberElements,
-                                    A_vals, A_rownos, A_colstarts, NULL);
-        matrixByRow.reverseOrderedCopyOf(columnCopy);
-    } else if (nonLinear == 1) {
-        // quadratic
-        asl = ASL_alloc(ASL_read_fg);
-        nl = jac0dim(stub, (ftnlen) strlen(stub));
-        free(stub);
-        suf_declare(suftab, sizeof(suftab) / sizeof(SufDecl));
-        /* read  model*/
-        X0 = (double*) malloc(n_var * sizeof(double));
-        CoinZeroN(X0, n_var);
-        qp_read(nl, 0);
-        assert (n_obj == 1);
-        int nz = 1 + n_con;
-        colqp = (fint**) malloc(nz * (2 * sizeof(int*)
-                                      + sizeof(double*)));
-        fint ** rowqp = colqp + nz;
-        double ** delsqp = (double **)(rowqp + nz);
-        z = (int*) malloc(nz * sizeof(int));
-        for (i = 0; i <= n_con; i++) {
-            z[i] = nqpcheck(-i, rowqp + i, colqp + i, delsqp + i);
-        }
-        qp_opify();
-        /* objective*/
-        objective = (double *) malloc(n_var * sizeof(double));
-        for (i = 0; i < n_var; i++)
-            objective[i] = 0.0;
-        if (n_obj) {
-            for (og = Ograd[0]; og; og = og->next)
-                objective[og->varno] = og->coef;
-        }
-        if (objtype[0])
-            direction = -1.0;
-        else
-            direction = 1.0;
-        objectiveOffset_ = objconst(0);
-        /* Column bounds*/
-        columnLower = (double *) malloc(n_var * sizeof(double));
-        columnUpper = (double *) malloc(n_var * sizeof(double));
-        for (i = 0; i < n_var; i++) {
-            columnLower[i] = LUv[2*i];
-            if (columnLower[i] <= negInfinity)
-                columnLower[i] = -COIN_DBL_MAX;
-            columnUpper[i] = LUv[2*i+1];
-            if (columnUpper[i] >= Infinity)
-                columnUpper[i] = COIN_DBL_MAX;
-        }
-        // Build by row from scratch
-        //matrixByRow.reserve(n_var,nzc,true);
-        // say row orderded
-        matrixByRow.transpose();
-        /* Row bounds*/
-        rowLower = (double *) malloc(n_con * sizeof(double));
-        rowUpper = (double *) malloc(n_con * sizeof(double));
-        CoinBigIndex * rowStart = new CoinBigIndex [n_con+1];
-        int * column = new int [nzc];
-        double * element = new double [nzc];
-        rowStart[0] = 0;
-        numberElements = 0;
-        for (i = 0; i < n_con; i++) {
-            rowLower[i] = LUrhs[2*i];
-            if (rowLower[i] <= negInfinity)
-                rowLower[i] = -COIN_DBL_MAX;
-            rowUpper[i] = LUrhs[2*i+1];
-            if (rowUpper[i] >= Infinity)
-                rowUpper[i] = COIN_DBL_MAX;
-            for (cgrad * cg = Cgrad[i]; cg; cg = cg->next) {
-                column[numberElements] = cg->varno;
-                element[numberElements++] = cg->coef;
-            }
-            rowStart[i+1] = numberElements;
-        }
-        assert (numberElements == nzc);
-        matrixByRow.appendRows(n_con, rowStart, column, element);
-        delete [] rowStart;
-        delete [] column;
-        delete [] element;
-        numberRows = n_con;
-        numberColumns = n_var;
-        //numberElements=nzc;
-        numberBinary = nbv;
-        numberIntegers = niv;
-        numberAllNonLinearBoth = nlvb;
-        numberIntegerNonLinearBoth = nlvbi;
-        numberAllNonLinearConstraints = nlvc;
-        numberIntegerNonLinearConstraints = nlvci;
-        numberAllNonLinearObjective = nlvo;
-        numberIntegerNonLinearObjective = nlvoi;
-        /* say we want primal solution */
-        want_xpi0 = 1;
-        //double * dualSolution=NULL;
-        // save asl
-        // Fix memory leak one day
-        CbcAmplInfo * info = new CbcAmplInfo;
-        //amplGamsData_ = info;
-        info->asl_ = NULL; // as wrong form asl;
-        info->nz_h_full_ = -1; // number of nonzeros in hessian
-        info->objval_called_with_current_x_ = false;
-        info->nerror_ = 0;
-        info->obj_sign_ = direction;
-        info->conval_called_with_current_x_ = false;
-        info->non_const_x_ = NULL;
-        info->jacval_called_with_current_x_ = false;
-        info->rowStart_ = NULL;
-        info->column_ = NULL;
-        info->gradient_ = NULL;
-        info->constraintValues_ = NULL;
-    } else if (nonLinear == 2) {
-        // General nonlinear!
-        //ASL_pfgh* asl = (ASL_pfgh*)ASL_alloc(ASL_read_pfgh);
-        asl = ASL_alloc(ASL_read_pfgh);
-        nl = jac0dim(stub, (ftnlen) strlen(stub));
-        free(stub);
-        suf_declare(suftab, sizeof(suftab) / sizeof(SufDecl));
-        /* read  model*/
-        X0 = (double*) malloc(n_var * sizeof(double));
-        CoinZeroN(X0, n_var);
-        // code stolen from Ipopt
-        int retcode = pfgh_read(nl, ASL_return_read_err | ASL_findgroups);
-
-        switch (retcode) {
-        case ASL_readerr_none : {}
-        break;
-        case ASL_readerr_nofile : {
-            printf( "Cannot open .nl file\n");
-            exit(-1);
-        }
-        break;
-        case ASL_readerr_nonlin : {
-            assert(false); // this better not be an error!
-            printf( "model involves nonlinearities (ed0read)\n");
-            exit(-1);
-        }
-        break;
-        case  ASL_readerr_argerr : {
-            printf( "user-defined function with bad args\n");
-            exit(-1);
-        }
-        break;
-        case ASL_readerr_unavail : {
-            printf( "user-defined function not available\n");
-            exit(-1);
-        }
-        break;
-        case ASL_readerr_corrupt : {
-            printf( "corrupt .nl file\n");
-            exit(-1);
-        }
-        break;
-        case ASL_readerr_bug : {
-            printf( "bug in .nl reader\n");
-            exit(-1);
-        }
-        break;
-        case ASL_readerr_CLP : {
-            printf( "ASL error message: \"solver cannot handle CLP extensions\"\n");
-            exit(-1);
-        }
-        break;
-        default: {
-            printf( "Unknown error in stub file read. retcode = %d\n", retcode);
-            exit(-1);
-        }
-        break;
-        }
-
-        // see "changes" in solvers directory of ampl code...
-        hesset(1, 0, 1, 0, nlc);
-
-        assert (n_obj == 1);
-        // find the nonzero structure for the hessian
-        // parameters to sphsetup:
-        int coeff_obj = 1; // coefficient of the objective fn ???
-        int mult_supplied = 1; // multipliers will be supplied
-        int uptri = 1; // only need the upper triangular part
-        // save asl
-        // Fix memory leak one day
-        CbcAmplInfo * info = new CbcAmplInfo;
-        moreInfo_ = (void *) info;
-        //amplGamsData_ = info;
-        info->asl_ = (ASL_pfgh *) asl;
-        // This is not easy to get from ampl so save
-        info->nz_h_full_ = sphsetup(-1, coeff_obj, mult_supplied, uptri);
-        info->objval_called_with_current_x_ = false;
-        info->nerror_ = 0;
-        info->obj_sign_ = direction;
-        info->conval_called_with_current_x_ = false;
-        info->non_const_x_ = NULL;
-        info->jacval_called_with_current_x_ = false;
-        // Look at nonlinear
-        if (nzc) {
-            n_conjac[1] = nlc; // just nonlinear
-            int * rowStart = new int [nlc+1];
-            info->rowStart_ = rowStart;
-            // See how many
-            int  current_nz = 0;
-            for (int i = 0; i < nlc; i++) {
-                for (cgrad* cg = Cgrad[i]; cg; cg = cg->next) {
-                    current_nz++;
-                }
-            }
-            // setup the structure
-            int * column = new int [current_nz];
-            info->column_ = column;
-            current_nz = 0;
-            rowStart[0] = 0;
-            for (int i = 0; i < nlc; i++) {
-                for (cgrad* cg = Cgrad[i]; cg; cg = cg->next) {
-                    cg->goff = current_nz;
-                    //iRow[cg->goff] = i ;
-                    //jCol[cg->goff] = cg->varno + 1;
-                    column[cg->goff] = cg->varno ;
-                    current_nz++;
-                }
-                rowStart[i+1] = current_nz;
-            }
-            info->gradient_ = new double [nzc];
-            info->constraintValues_ = new double [nlc];
-        }
-        /* objective*/
-        objective = (double *) malloc(n_var * sizeof(double));
-        for (i = 0; i < n_var; i++)
-            objective[i] = 0.0;
-        if (n_obj) {
-            for (og = Ograd[0]; og; og = og->next)
-                objective[og->varno] = og->coef;
-        }
-        if (objtype[0])
-            direction = -1.0;
-        else
-            direction = 1.0;
-        objectiveOffset_ = objconst(0);
-        /* Column bounds*/
-        columnLower = (double *) malloc(n_var * sizeof(double));
-        columnUpper = (double *) malloc(n_var * sizeof(double));
-        for (i = 0; i < n_var; i++) {
-            columnLower[i] = LUv[2*i];
-            if (columnLower[i] <= negInfinity)
-                columnLower[i] = -COIN_DBL_MAX;
-            columnUpper[i] = LUv[2*i+1];
-            if (columnUpper[i] >= Infinity)
-                columnUpper[i] = COIN_DBL_MAX;
-        }
-        // Build by row from scratch
-        //matrixByRow.reserve(n_var,nzc,true);
-        // say row orderded
-        matrixByRow.transpose();
-        CoinBigIndex * rowStart = new CoinBigIndex [n_con+1];
-        int * column = new int [nzc];
-        double * element = new double [nzc];
-        rowStart[0] = 0;
-        numberElements = 0;
-        /* Row bounds*/
-        rowLower = (double *) malloc(n_con * sizeof(double));
-        rowUpper = (double *) malloc(n_con * sizeof(double));
-        for (i = 0; i < n_con; i++) {
-            rowLower[i] = LUrhs[2*i];
-            if (rowLower[i] <= negInfinity)
-                rowLower[i] = -COIN_DBL_MAX;
-            rowUpper[i] = LUrhs[2*i+1];
-            if (rowUpper[i] >= Infinity)
-                rowUpper[i] = COIN_DBL_MAX;
-            for (cgrad * cg = Cgrad[i]; cg; cg = cg->next) {
-                column[numberElements] = cg->varno;
-                double value = cg->coef;
-                if (!value)
-                    value = -1.2345e-29;
-                element[numberElements++] = value;
-            }
-            rowStart[i+1] = numberElements;
-        }
-        assert (numberElements == nzc);
-        matrixByRow.appendRows(n_con, rowStart, column, element);
-        delete [] rowStart;
-        delete [] column;
-        delete [] element;
-        numberRows = n_con;
-        numberColumns = n_var;
-        numberElements = nzc;
-        numberBinary = nbv;
-        numberIntegers = niv;
-        numberAllNonLinearBoth = nlvb;
-        numberIntegerNonLinearBoth = nlvbi;
-        numberAllNonLinearConstraints = nlvc;
-        numberIntegerNonLinearConstraints = nlvci;
-        numberAllNonLinearObjective = nlvo;
-        numberIntegerNonLinearObjective = nlvoi;
-        /* say we want primal solution */
-        want_xpi0 = 1;
-        //double * dualSolution=NULL;
-    } else {
-        abort();
-    }
-    // set problem name
-    problemName_ = "???";
-
-    // Build by row from scratch
-    const double * element = matrixByRow.getElements();
-    const int * column = matrixByRow.getIndices();
-    const CoinBigIndex * rowStart = matrixByRow.getVectorStarts();
-    const int * rowLength = matrixByRow.getVectorLengths();
-    for (i = 0; i < numberRows; i++) {
-        addRow(rowLength[i], column + rowStart[i],
-               element + rowStart[i], rowLower[i], rowUpper[i]);
-    }
-    // Now do column part
-    for (i = 0; i < numberColumns; i++) {
-        setColumnBounds(i, columnLower[i], columnUpper[i]);
-        setColumnObjective(i, objective[i]);
-    }
-    for ( i = numberColumns - numberBinary - numberIntegers;
-            i < numberColumns; i++) {
-        setColumnIsInteger(i, true);
-    }
-    // and non linear
-    for (i = numberAllNonLinearBoth - numberIntegerNonLinearBoth;
-            i < numberAllNonLinearBoth; i++) {
-        setColumnIsInteger(i, true);
-    }
-    for (i = numberAllNonLinearConstraints - numberIntegerNonLinearConstraints;
-            i < numberAllNonLinearConstraints; i++) {
-        setColumnIsInteger(i, true);
-    }
-    for (i = numberAllNonLinearObjective - numberIntegerNonLinearObjective;
-            i < numberAllNonLinearObjective; i++) {
-        setColumnIsInteger(i, true);
-    }
-    free(columnLower);
-    free(columnUpper);
-    free(rowLower);
-    free(rowUpper);
-    free(objective);
-    // do names
-    int iRow;
-    for (iRow = 0; iRow < numberRows_; iRow++) {
-        char name[9];
-        sprintf(name, "r%7.7d", iRow);
-        setRowName(iRow, name);
-    }
-    int iColumn;
-    for (iColumn = 0; iColumn < numberColumns_; iColumn++) {
-        char name[9];
-        sprintf(name, "c%7.7d", iColumn);
-        setColumnName(iColumn, name);
-    }
-    if (colqp) {
-        // add in quadratic
-        int nz = 1 + n_con;
-        int nOdd = 0;
-        fint ** rowqp = colqp + nz;
-        double ** delsqp = (double **)(rowqp + nz);
-        for (i = 0; i <= n_con; i++) {
-            int nels = z[i];
-            if (nels) {
-                double * element = delsqp[i];
-                int * start = (int *) colqp[i];
-                int * row = (int *) rowqp[i];
-                if (!element) {
-                    // odd row - probably not quadratic
-                    nOdd++;
-                    continue;
-                }
-#ifdef JJF_ZERO
-                printf("%d quadratic els\n", nels);
-                for (int j = 0; j < n_var; j++) {
-                    for (int k = start[j]; k < start[j+1]; k++)
-                        printf("%d %d %g\n", j, row[k], element[k]);
-                }
-#endif
-                if (i) {
-                    int iRow = i - 1;
-                    for (int j = 0; j < n_var; j++) {
-                        for (int k = start[j]; k < start[j+1]; k++) {
-                            int kColumn = row[k];
-                            double value = element[k];
-                            // ampl gives twice with assumed 0.5
-                            if (kColumn < j)
-                                continue;
-                            else if (kColumn == j)
-                                value *= 0.5;
-                            const char * expr = getElementAsString(iRow, j);
-                            double constant = 0.0;
-                            bool linear;
-                            if (expr && strcmp(expr, "Numeric")) {
-                                linear = false;
-                            } else {
-                                constant = getElement(iRow, j);
-                                linear = true;
-                            }
-                            char temp[1000];
-                            char temp2[30];
-                            if (value == 1.0)
-                                sprintf(temp2, "c%7.7d", kColumn);
-                            else
-                                sprintf(temp2, "%g*c%7.7d", value, kColumn);
-                            if (linear) {
-                                if (!constant)
-                                    strcpy(temp, temp2);
-                                else if (value > 0.0)
-                                    sprintf(temp, "%g+%s", constant, temp2);
-                                else
-                                    sprintf(temp, "%g%s", constant, temp2);
-                            } else {
-                                if (value > 0.0)
-                                    sprintf(temp, "%s+%s", expr, temp2);
-                                else
-                                    sprintf(temp, "%s%s", expr, temp2);
-                            }
-                            assert (strlen(temp) < 1000);
-                            setElement(iRow, j, temp);
-                            if (amplInfo->logLevel > 1)
-                                printf("el for row %d column c%7.7d is %s\n", iRow, j, temp);
-                        }
-                    }
-                } else {
-                    // objective
-                    for (int j = 0; j < n_var; j++) {
-                        for (int k = start[j]; k < start[j+1]; k++) {
-                            int kColumn = row[k];
-                            double value = element[k];
-                            // ampl gives twice with assumed 0.5
-                            if (kColumn < j)
-                                continue;
-                            else if (kColumn == j)
-                                value *= 0.5;
-                            const char * expr = getColumnObjectiveAsString(j);
-                            double constant = 0.0;
-                            bool linear;
-                            if (expr && strcmp(expr, "Numeric")) {
-                                linear = false;
-                            } else {
-                                constant = getColumnObjective(j);
-                                linear = true;
-                            }
-                            char temp[1000];
-                            char temp2[30];
-                            if (value == 1.0)
-                                sprintf(temp2, "c%7.7d", kColumn);
-                            else
-                                sprintf(temp2, "%g*c%7.7d", value, kColumn);
-                            if (linear) {
-                                if (!constant)
-                                    strcpy(temp, temp2);
-                                else if (value > 0.0)
-                                    sprintf(temp, "%g+%s", constant, temp2);
-                                else
-                                    sprintf(temp, "%g%s", constant, temp2);
-                            } else {
-                                if (value > 0.0)
-                                    sprintf(temp, "%s+%s", expr, temp2);
-                                else
-                                    sprintf(temp, "%s%s", expr, temp2);
-                            }
-                            assert (strlen(temp) < 1000);
-                            setObjective(j, temp);
-                            if (amplInfo->logLevel > 1)
-                                printf("el for objective column c%7.7d is %s\n", j, temp);
-                        }
-                    }
-                }
-            }
-        }
-        if (nOdd) {
-            printf("%d non-linear constraints could not be converted to quadratic\n", nOdd);
-            exit(77);
-        }
-    }
-    free(colqp);
-    free(z);
-    // see if any sos
-    {
-        char *sostype;
-        int nsosnz, *sosbeg, *sosind, * sospri;
-        double *sosref;
-        int nsos;
-        int i = ASL_suf_sos_explict_free;
-        int copri[2], **p_sospri;
-        copri[0] = 0;
-        copri[1] = 0;
-        p_sospri = &sospri;
-        nsos = suf_sos(i, &nsosnz, &sostype, p_sospri, copri,
-                       &sosbeg, &sosind, &sosref);
-        if (nsos) {
-            numberSOS_ = nsos;
-            typeSOS_ = new int [numberSOS_];
-            prioritySOS_ = new int [numberSOS_];
-            startSOS_ = new int [numberSOS_+1];
-            memberSOS_ = new int[nsosnz];
-            referenceSOS_ = new double [nsosnz];
-            sos_kludge(nsos, sosbeg, sosref, sosind);
-            for (int i = 0; i < nsos; i++) {
-                int ichar = sostype[i];
-                assert (ichar == '1' || ichar == '2');
-                typeSOS_[i] = ichar - '0';
-            }
-            memcpy(prioritySOS_, sospri, nsos*sizeof(int));
-            memcpy(startSOS_, sosbeg, (nsos + 1)*sizeof(int));
-            memcpy(memberSOS_, sosind, nsosnz*sizeof(int));
-            memcpy(referenceSOS_, sosref, nsosnz*sizeof(double));
-        }
-    }
-}
-#else
-#include "Cbc_ampl.h"
-int
-readAmpl(ampl_info * , int , char **, void ** )
-{
-    return 0;
-}
-void freeArrays1(ampl_info *)
-{
-}
-void freeArrays2(ampl_info *)
-{
-}
-void freeArgs(ampl_info * )
-{
-}
-int ampl_obj_prec()
-{
-    return 0;
-}
-void writeAmpl(ampl_info * )
-{
-}
-#endif
-
diff --git a/cbits/coin/CglAllDifferent.cpp b/cbits/coin/CglAllDifferent.cpp
deleted file mode 100644
--- a/cbits/coin/CglAllDifferent.cpp
+++ /dev/null
@@ -1,578 +0,0 @@
-// Copyright (C) 2005, International Business Machines
-// Corporation and others.  All Rights Reserved.
-// This code is licensed under the terms of the Eclipse Public License (EPL).
-
-#include <cstdlib>
-#include <cstdio>
-#include <cmath>
-#include <cfloat>
-#include <cassert>
-#include <iostream>
-//#define PRINT_DEBUG
-//#define CGL_DEBUG 1
-//#undef NDEBUG
-#include "CoinPragma.hpp"
-#include "CoinHelperFunctions.hpp"
-#include "CoinPackedVector.hpp"
-#include "CoinPackedMatrix.hpp"
-#include "CoinFinite.hpp"
-#include "OsiRowCutDebugger.hpp"
-#include "CglAllDifferent.hpp"
-
-#ifdef CGL_DEBUG
-// A declaration is required somewhere, eh? I'm assuming static so the value
-// carries over between calls to generateCuts.
-namespace { int nPath = 0 ; }
-#endif
-//-------------------------------------------------------------------
-// Generate cuts
-//------------------------------------------------------------------- 
-void CglAllDifferent::generateCuts(const OsiSolverInterface & si, OsiCuts & cs,
-			      const CglTreeInfo )
-{
-#ifndef NDEBUG
-  int nCols=si.getNumCols();
-#endif
-  int i;
-  const double * lower = si.getColLower();
-  const double * upper = si.getColUpper();
-#ifdef CGL_DEBUG
-  const OsiRowCutDebugger * debugger = si.getRowCutDebugger();
-  if (debugger&&debugger->onOptimalPath(si)) {
-    printf("On optimal path %d\n",nPath);
-    nPath++;
-    int nCols=si.getNumCols();
-    const double * solution = si.getColSolution();
-    const double * optimal = debugger->optimalSolution();
-    const double * objective = si.getObjCoefficients();
-    double objval1=0.0,objval2=0.0;
-    for (i=0;i<nCols;i++) {
-#if CGL_DEBUG>1
-      printf("%d %g %g %g %g\n",i,lower[i],solution[i],upper[i],optimal[i]);
-#endif
-      objval1 += solution[i]*objective[i];
-      objval2 += optimal[i]*objective[i];
-      assert(optimal[i]>=lower[i]&&optimal[i]<=upper[i]);
-    }
-    printf("current obj %g, integer %g\n",objval1,objval2);
-  }
-#endif
-  int * lo = new int[numberDifferent_];
-  int * up = new int[numberDifferent_];
-  for (i=0;i<numberDifferent_;i++) {
-    int iColumn = originalWhich_[i];
-    assert (iColumn<nCols);
-    lo[i]  = static_cast<int> (lower[iColumn]);
-    assert (floor(lower[iColumn]+0.5)==lower[iColumn]);
-    up[i]  = static_cast<int> (upper[iColumn]);
-    assert (floor(upper[iColumn]+0.5)==upper[iColumn]);
-    assert (up[i]>=lo[i]);
-  }
-  // We are going to assume we can just have one big 2d array!
-  // Could save by going to bits
-  // also could skip sets where all are fixed
-  // could do some of above by separate first pass
-  // once a variable fixed - can take out of list
-  // so need to redo complete stuff (including temp which_) every big pass
-  int offset = COIN_INT_MAX;
-  int maxValue = -COIN_INT_MAX;
-  int numberLook=0;
-  // copies
-  //int * which = new int [numberTotal];
-  //int * start = new int [numberSets_+1];
-  for (i=0;i<numberSets_;i++) {
-    for (int j=start_[i];j<start_[i+1];j++) {
-      int k=which_[j];
-      offset = CoinMin(offset,lo[k]);
-      maxValue = CoinMax(maxValue,up[k]);
-    }
-    numberLook++;
-    int gap = maxValue-offset+1;
-    double size = static_cast<double> (gap) * numberDifferent_;
-    if (size>1.0e7) {
-      if (logLevel_)
-        printf("Only looking at %d sets\n",numberLook);
-      break;
-    }
-  }
-  // Which sets a variable is in
-  int * back = new int [start_[numberSets_]];
-  int * backStart = new int[numberDifferent_+1];
-  memset(backStart,0,(numberDifferent_+1)*sizeof(int));
-  int numberTotal = start_[numberLook];
-  for (i=0;i<numberTotal;i++) {
-    int k=which_[i];
-    // note +1 
-    backStart[k+1]++;
-  }
-  int n=0;
-  for (i=0;i<numberDifferent_;i++) {
-    int nThis = backStart[i+1];
-    backStart[i+1]=n;
-    n+= nThis;
-  }
-  // at end all backStart correct!
-  for (i=0;i<numberLook;i++) {
-    for (int j=start_[i];j<start_[i+1];j++) {
-      int k=which_[j];
-      // note +1 
-      int iPut = backStart[k+1];
-      back[iPut]=i;
-      backStart[k+1]=iPut+1;
-    }
-  }
-  // value is possible for variable k if possible[k*gap+value] is nonzero
-  int gap = maxValue-offset+1;
-  char * possible = new char[gap*numberDifferent_];
-  memset(possible,0,gap*numberDifferent_);
-  // initialize
-  int numberFixed=0;
-  int * alreadyFixed = new int[numberDifferent_];
-  for (i=0;i<numberDifferent_;i++) {
-    alreadyFixed[i]=-1;
-    int startV = i*gap + lo[i] - offset;
-    int n = up[i]-lo[i]+1;
-    memset(possible+startV,1,n);
-  }
-  for (i=0;i<numberDifferent_;i++) {
-    int n = up[i]-lo[i]+1;
-    if (n==1) {
-      int fixedAt = lo[i]-offset;
-      numberFixed++;
-      alreadyFixed[i]=fixedAt;
-      // take out of all others
-      for (int j=backStart[i];j<backStart[i+1];j++) {
-        int iSet = back[j];
-        for (int jj=start_[iSet];jj<start_[iSet+1];jj++) {
-          int k=which_[jj];
-          if (k!=i) {
-            // impossible
-            possible[k*gap+fixedAt]=0;
-          }
-        }
-      }
-    }
-  }
-  bool finished=false;
-  //int numberTightened=0;
-  bool infeasible=false;
-  // space to see which values possible
-  int * check = new int[gap];
-  unsigned int * bitmap = new unsigned int[numberDifferent_];
-  int * stack = new int[numberDifferent_+1];
-  int * first = new int[numberDifferent_+1];
-  // just for valgrind etc
-  memset(stack,0,(numberDifferent_+1)*sizeof(int));
-  memset(first,0,(numberDifferent_+1)*sizeof(int));
-  // do one set at a time
-  while (!finished) {
-    finished=true;
-    int fixed=numberFixed;
-    for (i=0;i<numberLook;i++) {
-      memset(check,0,gap*sizeof(int));
-      for (int j=start_[i];j<start_[i+1];j++) {
-        int k=which_[j];
-        if (alreadyFixed[k]>=0) {
-          if (check[alreadyFixed[k]]==0) {
-            check[alreadyFixed[k]]=1;
-            continue;
-          } else {
-            // infeasible
-            infeasible=true;
-            i=numberLook;
-            break;
-          }
-        }
-        char * allowed = possible + k*gap;
-        int n=0;
-        for (int jj=0;jj<gap;jj++) {
-          if (allowed[jj]) {
-            n++;
-            check[jj]++;
-          }
-        }
-        if (n<2) {
-          if (n==1) {
-            // fix
-            int fixedAt = -1;
-            for (int jj=0;jj<gap;jj++) {
-              if (allowed[jj]) {
-                fixedAt=jj;
-                break;
-              }
-            }
-            numberFixed++;
-            alreadyFixed[k]=fixedAt;
-            check[fixedAt]=1;
-            // take out of all others
-            for (int j=backStart[k];j<backStart[k+1];j++) {
-              int iSet = back[j];
-              for (int jj=start_[iSet];jj<start_[iSet+1];jj++) {
-                int kk=which_[jj];
-                if (kk!=k) {
-                  // impossible
-                  possible[kk*gap+fixedAt]=0;
-                }
-              }
-            }
-          } else {
-            // infeasible
-            infeasible=true;
-            j=numberTotal;
-            i=numberLook;
-            break;
-          }
-        }
-      }
-      // now check set
-      // If number covered < number in set infeasible
-      if (gap<30&&!infeasible) {
-        int n=start_[i+1]-start_[i];
-        memset(bitmap,0,n*sizeof(unsigned int));
-        int j;
-        int * which = which_+start_[i];
-        unsigned int covered=0;
-        bool good=true;
-        for (j=0;j<n;j++) {
-          int k=which[j];
-          char * allowed = possible + k*gap;
-          int jj;
-          for (jj=0;jj<gap;jj++) 
-            if (allowed[jj]) 
-              break;
-          assert (jj<gap);
-          first[j]=jj;
-          unsigned int iBit = 1<<jj;
-          if ((covered&iBit)==0) {
-            stack[j]=jj;
-            covered |= iBit;
-          } else {
-            // can't
-            jj++;
-            for (;jj<gap;jj++) {
-              iBit  = iBit << 1;
-              if (allowed[jj]&&(covered&iBit)==0) 
-                break;
-            }
-            if (jj<gap) {
-              stack[j]=jj;
-              covered |= iBit;
-            } else {
-              good = false;
-              break;
-            }
-          }
-        }
-        int nStack=j;
-        // just do first for rest
-        for (;j<n;j++) {
-          int k=which[j];
-          char * allowed = possible + k*gap;
-          int jj;
-          for (jj=0;jj<gap;jj++) 
-            if (allowed[jj]) 
-              break;
-          assert (jj<gap);
-          first[j]=jj;
-        }
-        int kLook=0;
-        while (nStack) {
-          nStack--;
-          if (good) {
-#if 0
-            printf("con %d = ",i);
-            for (j=0;j<n;j++) 
-              printf("%d ",stack[j]+1);
-            printf("\n");
-#endif
-            // bug - kLook >= 0
-            kLook=0;
-            for (j=kLook;j<n;j++) {
-              int iBit = 1 << stack[j];
-              bitmap[j] |= iBit;
-            }
-          }
-          kLook=nStack;
-          int jj=stack[nStack];
-          unsigned int iBit = 1<<jj;
-          covered &= ~iBit;
-          {
-            unsigned int kBit=0;
-            for (int k=0;k<nStack;k++) {
-              int kk=stack[k];
-              kBit |= 1<<kk;
-            }
-            assert (covered==kBit);
-          }
-          jj++;
-          stack[nStack]=jj;
-          while (nStack<n) {
-            int k=which[nStack];
-            char * allowed = possible + k*gap;
-            for (;jj<gap;jj++) {
-              iBit  = 1 << jj;
-              if (allowed[jj]&&(covered&iBit)==0) 
-                break;
-            }
-            if (jj<gap) {
-              stack[nStack]=jj;
-              covered |= iBit;
-              nStack++;
-              stack[nStack]=first[nStack];
-              jj = first[nStack];
-              good=true;
-            } else {
-              good = false;
-              break;
-            }
-          }
-        }
-        int nnFix=0;
-        // Now see if we can fix any
-        for (j=0;j<n;j++) {
-          int k=which[j];
-          unsigned int mapped = bitmap[j];
-          char * allowed = possible + k*gap;
-          unsigned int iBit=1;
-          for (int jj=0;jj<gap;jj++) {
-            if ((mapped&iBit)==0) {
-              if (allowed[jj]) {
-                if (!nnFix)
-                  printf("for con %d x ",i);
-                nnFix++;
-                printf("%d not %d ",j,jj+1);
-                allowed[jj]=0;
-                finished=false;
-              }
-            }
-            iBit  = iBit << 1;
-          }
-        }
-        if (nnFix)
-          printf("\n");
-      }
-    }
-    if (numberFixed>fixed)
-      finished=false; // try again
-  }
-  // Could try two sets
-  if (infeasible) {
-    // create infeasible cut
-    OsiRowCut rc;
-    rc.setLb(COIN_DBL_MAX);
-    rc.setUb(0.0);   
-    cs.insert(rc);
-  } else {
-    // check to see if can tighten bounds
-    CoinPackedVector lbs;
-    CoinPackedVector ubs;
-    int nTightened=0;
-    for (i=0;i<numberDifferent_;i++) {
-      int iColumn = originalWhich_[i];
-      char * allowed = possible+i*gap;
-      int firstLo=-1;
-      int lastUp=-1;
-      for (int jj=0;jj<gap;jj++) {
-        if (allowed[jj]) {
-          if (firstLo<0)
-            firstLo=jj;
-          lastUp = jj;
-        }
-      }
-      if (firstLo+offset>lo[i]) {
-        lbs.insert(iColumn,static_cast<double> (firstLo+offset));
-        nTightened++;
-      }
-      if (lastUp+offset<up[i]) {
-        ubs.insert(iColumn,static_cast<double> (lastUp+offset));
-        nTightened++;
-      }
-    }
-    if (nTightened) {
-      OsiColCut cc;
-      cc.setUbs(ubs);
-      cc.setLbs(lbs);
-      cc.setEffectiveness(100.0);
-      cs.insert(cc);
-    }
-  }
-  //delete [] which;
-  //delete [] start;
-  delete [] first;
-  delete [] stack;
-  delete [] bitmap;
-  delete [] check;
-  delete [] alreadyFixed;
-  delete [] back;
-  delete [] backStart;
-  delete [] possible;
-  delete [] lo;
-  delete [] up;
-}
-
-//-------------------------------------------------------------------
-// Default Constructor 
-//-------------------------------------------------------------------
-CglAllDifferent::CglAllDifferent ()
-:
-CglCutGenerator(),
-numberSets_(0),
-numberDifferent_(0),
-maxLook_(2),
-logLevel_(0),
-start_(NULL),
-which_(NULL),
-originalWhich_(NULL)
-{
-}
-
-//-------------------------------------------------------------------
-// Useful Constructor 
-//-------------------------------------------------------------------
-CglAllDifferent::CglAllDifferent (int numberSets,
-                                  const int * starts, const int * which)
-:
-CglCutGenerator(),
-numberSets_(numberSets),
-maxLook_(2),
-logLevel_(0),
-start_(NULL),
-which_(NULL),
-originalWhich_(NULL)
-{
-  if (numberSets_>0) {
-    int n = starts[numberSets_];
-    start_ = CoinCopyOfArray(starts,numberSets_+1);
-    originalWhich_ = CoinCopyOfArray(which,n);
-    which_ = new int[n];
-    int i;
-    int maxValue=-1;
-    for (i=0;i<n;i++) {
-      int iColumn = which[i];
-      assert (iColumn>=0);
-      maxValue = CoinMax(iColumn,maxValue);
-    }
-    maxValue++;
-    int * translate = new int[maxValue];
-    for (i=0;i<maxValue;i++)
-      translate[i]=-1;
-    for (i=0;i<n;i++) {
-      int iColumn = which[i];
-      translate[iColumn]=0;
-    }
-    numberDifferent_=0;
-    for (i=0;i<maxValue;i++) {
-      if (!translate[i]) 
-        translate[i]=numberDifferent_++;
-    }
-    // Now translate
-    for (i=0;i<n;i++) {
-      int iColumn = which[i];
-      iColumn = translate[iColumn];
-      assert (iColumn>=0);
-      which_[i]=iColumn;
-    }
-    delete [] translate;
-  }
-}
-
-//-------------------------------------------------------------------
-// Copy constructor 
-//-------------------------------------------------------------------
-CglAllDifferent::CglAllDifferent (  const CglAllDifferent & rhs)
-                                                              :
-  CglCutGenerator(rhs),
-  numberSets_(rhs.numberSets_),
-  numberDifferent_(rhs.numberDifferent_),
-  maxLook_(rhs.maxLook_),
-  logLevel_(rhs.logLevel_)
-{  
-  if (numberSets_) {
-    int n = rhs.start_[numberSets_];
-    start_ = CoinCopyOfArray(rhs.start_,numberSets_+1);
-    which_ = CoinCopyOfArray(rhs.which_,n);
-    originalWhich_ = CoinCopyOfArray(rhs.originalWhich_,n);
-  } else {
-    start_=NULL;
-    which_=NULL;
-    originalWhich_=NULL;
-  }
-}
-
-//-------------------------------------------------------------------
-// Clone
-//-------------------------------------------------------------------
-CglCutGenerator *
-CglAllDifferent::clone() const
-{
-  return new CglAllDifferent(*this);
-}
-
-//-------------------------------------------------------------------
-// Destructor 
-//-------------------------------------------------------------------
-CglAllDifferent::~CglAllDifferent ()
-{
-  // free memory
-  delete [] start_;
-  delete [] which_;
-  delete [] originalWhich_;
-}
-
-//----------------------------------------------------------------
-// Assignment operator 
-//-------------------------------------------------------------------
-CglAllDifferent &
-CglAllDifferent::operator=(
-                                         const CglAllDifferent& rhs)
-{
-  if (this != &rhs) {
-    CglCutGenerator::operator=(rhs);
-    // free memory
-    delete [] start_;
-    delete [] which_;
-    delete [] originalWhich_;
-    numberSets_ = rhs.numberSets_;
-    numberDifferent_ = rhs.numberDifferent_;
-    maxLook_ = rhs.maxLook_;
-    logLevel_ = rhs.logLevel_;
-    if (numberSets_) {
-      int n = rhs.start_[numberSets_];
-      start_ = CoinCopyOfArray(rhs.start_,numberSets_+1);
-      which_ = CoinCopyOfArray(rhs.which_,n);
-      originalWhich_ = CoinCopyOfArray(rhs.originalWhich_,n);
-    } else {
-      start_=NULL;
-      which_=NULL;
-      originalWhich_=NULL;
-    }
-  }
-  return *this;
-}
-
-/// This can be used to refresh any inforamtion
-void 
-CglAllDifferent::refreshSolver(OsiSolverInterface * )
-{
-}
-// Create C++ lines to get to current state
-std::string
-CglAllDifferent::generateCpp( FILE * fp) 
-{
-  CglAllDifferent other;
-  fprintf(fp,"0#include \"CglAllDifferent.hpp\"\n");
-  fprintf(fp,"3  CglAllDifferent allDifferent;\n");
-  if (logLevel_!=other.logLevel_)
-    fprintf(fp,"3  allDifferent.setLogLevel(%d);\n",logLevel_);
-  else
-    fprintf(fp,"4  allDifferent.setLogLevel(%d);\n",logLevel_);
-  if (maxLook_!=other.maxLook_)
-    fprintf(fp,"3  allDifferent.setMaxLook(%d);\n",maxLook_);
-  else
-    fprintf(fp,"4  allDifferent.setMaxLook(%d);\n",maxLook_);
-  if (getAggressiveness()!=other.getAggressiveness())
-    fprintf(fp,"3  allDifferent.setAggressiveness(%d);\n",getAggressiveness());
-  else
-    fprintf(fp,"4  allDifferent.setAggressiveness(%d);\n",getAggressiveness());
-  return "allDifferent";
-}
diff --git a/cbits/coin/CglLandPTest.cpp b/cbits/coin/CglLandPTest.cpp
deleted file mode 100644
--- a/cbits/coin/CglLandPTest.cpp
+++ /dev/null
@@ -1,352 +0,0 @@
-// $Id: CglLandPTest.cpp 1123 2013-04-06 20:47:24Z stefan $
-// Copyright (C) 2000-2009, International Business Machines
-// Corporation and others.  All Rights Reserved.
-// This code is licensed under the terms of the Eclipse Public License (EPL).
-
-// UnitTest for CglGomory adapted for lift-and-project
-
-#include <cstdio>
-
-#ifdef NDEBUG
-#undef NDEBUG
-#endif
-
-#include <cassert>
-
-#include "CoinPragma.hpp"
-#include "CoinPackedMatrix.hpp"
-#include "OsiCuts.hpp"
-#include "CoinWarmStartBasis.hpp"
-#include "CglLandP.hpp"
-
-void
-CglLandPUnitTest(
-    OsiSolverInterface * si,
-    const std::string &mpsDir)
-{
-    CoinRelFltEq eq(1e-05);
-    // Test default constructor
-    {
-        CglLandP aGenerator;
-        assert(aGenerator.parameter().pivotLimit==20);
-        assert(aGenerator.parameter().maxCutPerRound==5000);
-        assert(aGenerator.parameter().failedPivotLimit==1);
-        assert(aGenerator.parameter().degeneratePivotLimit==0);
-        assert(eq(aGenerator.parameter().pivotTol, 1e-04));
-        assert(eq(aGenerator.parameter().away, 5e-04));
-        assert(eq(aGenerator.parameter().timeLimit, COIN_DBL_MAX));
-        assert(eq(aGenerator.parameter().singleCutTimeLimit, COIN_DBL_MAX));
-        assert(aGenerator.parameter().useTableauRow==true);
-        assert(aGenerator.parameter().modularize==false);
-        assert(aGenerator.parameter().strengthen==true);
-        assert(aGenerator.parameter().perturb==true);
-        assert(aGenerator.parameter().pivotSelection==CglLandP::mostNegativeRc);
-    }
-
-
-    // Test copy constructor
-    {
-        CglLandP a;
-        {
-            CglLandP b;
-            b.parameter().pivotLimit = 100;
-            b.parameter().maxCutPerRound = 100;
-            b.parameter().failedPivotLimit = 10;
-            b.parameter().degeneratePivotLimit = 10;
-            b.parameter().pivotTol = 1e-07;
-            b.parameter().away = 1e-10;
-            b.parameter().timeLimit = 120;
-            b.parameter().singleCutTimeLimit = 15;
-            b.parameter().useTableauRow = true;
-            b.parameter().modularize = true;
-            b.parameter().strengthen = false;
-            b.parameter().perturb = false;
-            b.parameter().pivotSelection=CglLandP::bestPivot;
-            //Test Copy
-            CglLandP c(b);
-            assert(c.parameter().pivotLimit == 100);
-            assert(c.parameter().maxCutPerRound == 100);
-            assert(c.parameter().failedPivotLimit == 10);
-            assert(c.parameter().degeneratePivotLimit == 10);
-            assert(c.parameter().pivotTol == 1e-07);
-            assert(c.parameter().away == 1e-10);
-            assert(c.parameter().timeLimit == 120);
-            assert(c.parameter().singleCutTimeLimit == 15);
-            assert(c.parameter().useTableauRow == true);
-            assert(c.parameter().modularize == true);
-            assert(c.parameter().strengthen == false);
-            assert(c.parameter().perturb == false);
-            assert(c.parameter().pivotSelection == CglLandP::bestPivot);
-            a=b;
-            assert(a.parameter().pivotLimit == 100);
-            assert(a.parameter().maxCutPerRound == 100);
-            assert(a.parameter().failedPivotLimit == 10);
-            assert(a.parameter().degeneratePivotLimit == 10);
-            assert(a.parameter().pivotTol == 1e-07);
-            assert(a.parameter().away == 1e-10);
-            assert(a.parameter().timeLimit == 120);
-            assert(a.parameter().singleCutTimeLimit == 15);
-            assert(a.parameter().useTableauRow == true);
-            assert(a.parameter().modularize == true);
-            assert(a.parameter().strengthen == false);
-            assert(a.parameter().perturb == false);
-            assert(a.parameter().pivotSelection == CglLandP::bestPivot);
-        }
-    }
-
-    {
-        //  Maximize  2 x2
-        // s.t.
-        //    2x1 +  2x2 <= 3
-        //   -2x1 +  2x2 <= 1
-        //    7x1 +  4x2 <= 8
-        //   -7x1 +  4x2 <= 1
-        //     x1, x2 >= 0 and x1, x2 integer
-        // Slacks are s1, s2, s3, s4
-
-
-
-        //Test that problem is correct
-        // Optimal Basis is x1, x2, s3, s4 with tableau
-        //    x1            0.25 s1  -0.25 s2             =  0.5
-        //           x2     0.25 s1   0.25 s2             =  1
-        //                 -2.75 s1   0.75 s2    s3       =  0.5
-        //                  0.75 s1  -2.75 s2        s4   =  0.5
-        // z=              -0.25 s1  -0.25 s2             =  -1
-        // Gomory cut from variable x1 is x2 <= 0.5
-        // Can be improved by first pivoting s2 in and s4 out, then s1 in and s3 out
-        // to x2 <= 0.25
-        {
-            int start[2] = {0,4};
-            int length[2] = {4,4};
-            int rows[8] = {0,1,2,3,0,1,2,3};
-            double elements[8] = {2.0,-2.0,7.0,-7.0,2.0,2.0,4.0,4.0};
-            CoinPackedMatrix  columnCopy(true,4,2,8,elements,rows,start,length);
-
-            double rowLower[4]={-COIN_DBL_MAX,-COIN_DBL_MAX,
-                                -COIN_DBL_MAX,-COIN_DBL_MAX};
-            double rowUpper[4]={3.,1.,8.,1.};
-            double colLower[2]={0.0,0.0};
-            double colUpper[2]={1.0,1.0};
-            double obj[2]={-1,-1};
-            int intVar[2]={0,1};
-
-            OsiSolverInterface  * siP = si->clone();
-            siP->loadProblem(columnCopy, colLower, colUpper, obj, rowLower, rowUpper);
-            siP->setInteger(intVar,2);
-            CglLandP test;
-            test.setLogLevel(2);
-            test.parameter().sepSpace = CglLandP::Full;
-            siP->resolve();
-            // Test generateCuts method
-            {
-                OsiCuts cuts;
-                test.generateCuts(*siP,cuts);
-                cuts.printCuts();
-                assert(cuts.sizeRowCuts()==1);
-                OsiRowCut aCut = cuts.rowCut(0);
-                assert(eq(aCut.lb(), -.0714286));
-                CoinPackedVector row = aCut.row();
-                if (row.getNumElements() == 1)
-                {
-                    assert(row.getIndices()[0]==1);
-                    assert(eq(row.getElements()[0], -4*.0714286));
-                }
-                else if (row.getNumElements() == 2)
-                {
-                    assert(row.getIndices()[0]==0);
-                    assert(eq(row.getElements()[0], 0.));
-                    assert(row.getIndices()[1]==1);
-                    assert(eq(row.getElements()[1], -1));
-                }
-                OsiSolverInterface::ApplyCutsReturnCode rc = siP->applyCuts(cuts);
-
-                siP->resolve();
-            }
-            if (0)
-            {
-                OsiCuts cuts;
-                test.generateCuts(*siP,cuts);
-                cuts.printCuts();
-                assert(cuts.sizeRowCuts()==1);
-                OsiRowCut aCut = cuts.rowCut(0);
-                CoinPackedVector row = aCut.row();
-                if (row.getNumElements() == 1)
-                {
-                    assert(row.getIndices()[0]==1);
-                    assert(eq(row.getElements()[0], -1));
-                }
-                else if (row.getNumElements() == 2)
-                {
-                    assert(row.getIndices()[0]==0);
-                    assert(eq(row.getElements()[0], 0.));
-                    assert(row.getIndices()[1]==1);
-                    assert(eq(row.getElements()[1], -1));
-                }
-                assert(eq(aCut.lb(), 0.));
-                OsiSolverInterface::ApplyCutsReturnCode rc = siP->applyCuts(cuts);
-
-                siP->resolve();
-            }
-            delete siP;
-        }
-    }
-
-    if (1)  //Test on p0033
-    {
-        // Setup
-        OsiSolverInterface  * siP = si->clone();
-        std::string fn(mpsDir+"p0033");
-        siP->readMps(fn.c_str(),"mps");
-        siP->activateRowCutDebugger("p0033");
-        CglLandP test;
-
-        // Solve the LP relaxation of the model and
-        // print out ofv for sake of comparison
-        siP->initialSolve();
-        double lpRelaxBefore=siP->getObjValue();
-        assert( eq(lpRelaxBefore, 2520.5717391304347) );
-#ifdef CGL_DEBUG
-        printf("\n\nOrig LP min=%f\n",lpRelaxBefore);
-#endif
-
-        OsiCuts cuts;
-
-        // Test generateCuts method
-        test.generateCuts(*siP,cuts);
-        OsiSolverInterface::ApplyCutsReturnCode rc = siP->applyCuts(cuts);
-
-        siP->resolve();
-        double lpRelaxAfter=siP->getObjValue();
-        //assert( eq(lpRelaxAfter, 2592.1908295194507) );
-
-        std::cout<<"Relaxation after "<<lpRelaxAfter<<std::endl;
-        assert( lpRelaxAfter> 2840. );
-#ifdef CGL_DEBUG
-        printf("\n\nOrig LP min=%f\n",lpRelaxBefore);
-        printf("\n\nFinal LP min=%f\n",lpRelaxAfter);
-#endif
-        assert( lpRelaxBefore < lpRelaxAfter );
-
-        delete siP;
-    }
-    if (1)  //test again with modularization
-    {
-        // Setup
-        OsiSolverInterface  * siP = si->clone();
-        std::string fn(mpsDir+"p0033");
-        siP->readMps(fn.c_str(),"mps");
-        siP->activateRowCutDebugger("p0033");
-        CglLandP test;
-        test.parameter().modularize = true;
-        // Solve the LP relaxation of the model and
-        // print out ofv for sake of comparison
-        siP->initialSolve();
-        double lpRelaxBefore=siP->getObjValue();
-        assert( eq(lpRelaxBefore, 2520.5717391304347) );
-#ifdef CGL_DEBUG
-        printf("\n\nOrig LP min=%f\n",lpRelaxBefore);
-#endif
-
-        OsiCuts cuts;
-
-        // Test generateCuts method
-        test.generateCuts(*siP,cuts);
-        OsiSolverInterface::ApplyCutsReturnCode rc = siP->applyCuts(cuts);
-
-        siP->resolve();
-        double lpRelaxAfter=siP->getObjValue();
-        //assert( eq(lpRelaxAfter, 2592.1908295194507) );
-
-        std::cout<<"Relaxation after "<<lpRelaxAfter<<std::endl;
-        assert( lpRelaxAfter> 2840. );
-#ifdef CGL_DEBUG
-        printf("\n\nOrig LP min=%f\n",lpRelaxBefore);
-        printf("\n\nFinal LP min=%f\n",lpRelaxAfter);
-#endif
-        assert( lpRelaxBefore < lpRelaxAfter );
-
-        delete siP;
-    }
-    if (1)  //test again with alternate pivoting rule
-    {
-        // Setup
-        OsiSolverInterface  * siP = si->clone();
-        std::string fn(mpsDir+"p0033");
-        siP->readMps(fn.c_str(),"mps");
-        siP->activateRowCutDebugger("p0033");
-        CglLandP test;
-        test.parameter().pivotSelection = CglLandP::bestPivot;
-        // Solve the LP relaxation of the model and
-        // print out ofv for sake of comparison
-        siP->initialSolve();
-        double lpRelaxBefore=siP->getObjValue();
-        assert( eq(lpRelaxBefore, 2520.5717391304347) );
-#ifdef CGL_DEBUG
-        printf("\n\nOrig LP min=%f\n",lpRelaxBefore);
-#endif
-
-        OsiCuts cuts;
-
-        // Test generateCuts method
-        test.generateCuts(*siP,cuts);
-        OsiSolverInterface::ApplyCutsReturnCode rc = siP->applyCuts(cuts);
-
-        siP->resolve();
-        double lpRelaxAfter=siP->getObjValue();
-        //assert( eq(lpRelaxAfter, 2592.1908295194507) );
-
-        std::cout<<"Relaxation after "<<lpRelaxAfter<<std::endl;
-        assert( lpRelaxAfter> 2840. );
-#ifdef CGL_DEBUG
-        printf("\n\nOrig LP min=%f\n",lpRelaxBefore);
-        printf("\n\nFinal LP min=%f\n",lpRelaxAfter);
-#endif
-        assert( lpRelaxBefore < lpRelaxAfter );
-
-        delete siP;
-    }
-
-    if (1)  //Finally test code in documentation
-    {
-        // Setup
-        OsiSolverInterface  * siP = si->clone();
-        std::string fn(mpsDir+"p0033");
-        siP->readMps(fn.c_str(),"mps");
-        siP->activateRowCutDebugger("p0033");
-        CglLandP landpGen;
-
-        landpGen.parameter().timeLimit = 10.;
-        landpGen.parameter().pivotLimit = 2;
-
-
-        // Solve the LP relaxation of the model and
-        // print out ofv for sake of comparison
-        siP->initialSolve();
-        double lpRelaxBefore=siP->getObjValue();
-        assert( eq(lpRelaxBefore, 2520.5717391304347) );
-#ifdef CGL_DEBUG
-        printf("\n\nOrig LP min=%f\n",lpRelaxBefore);
-#endif
-
-        OsiCuts cuts;
-
-        // Test generateCuts method
-        landpGen.generateCuts(*siP, cuts);
-        OsiSolverInterface::ApplyCutsReturnCode rc = siP->applyCuts(cuts);
-
-        siP->resolve();
-        double lpRelaxAfter=siP->getObjValue();
-        //assert( eq(lpRelaxAfter, 2592.1908295194507) );
-
-        std::cout<<"Relaxation after "<<lpRelaxAfter<<std::endl;
-        assert( lpRelaxAfter> 2840. );
-#ifdef CGL_DEBUG
-        printf("\n\nOrig LP min=%f\n",lpRelaxBefore);
-        printf("\n\nFinal LP min=%f\n",lpRelaxAfter);
-#endif
-        assert( lpRelaxBefore < lpRelaxAfter );
-
-        delete siP;
-    }
-}
diff --git a/cbits/coin/CglLiftAndProject.cpp b/cbits/coin/CglLiftAndProject.cpp
deleted file mode 100644
--- a/cbits/coin/CglLiftAndProject.cpp
+++ /dev/null
@@ -1,396 +0,0 @@
-// Copyright (C) 2000, International Business Machines
-// Corporation and others.  All Rights Reserved.
-// This code is licensed under the terms of the Eclipse Public License (EPL).
-
-#include <cstdlib>
-#include <cstdio>
-#include <cmath>
-#include <cassert>
-#include <cfloat>
-#include <iostream>
-
-#include "CoinPragma.hpp"
-#include "CoinHelperFunctions.hpp"
-#include "CglLiftAndProject.hpp"
-#include "CoinPackedVector.hpp"
-#include "CoinSort.hpp"
-#include "CoinPackedMatrix.hpp"
-
-//-----------------------------------------------------------------------------
-// Generate Lift-and-Project cuts
-//------------------------------------------------------------------- 
-void CglLiftAndProject::generateCuts(const OsiSolverInterface& si, OsiCuts& cs,
-				     const CglTreeInfo /*info*/)
-{
-  // Assumes the mixed 0-1 problem 
-  //
-  //   min {cx: <Atilde,x> >= btilde} 
-  //
-  // is in canonical form with all bounds,
-  // including x_t>=0, -x_t>=-1 for x_t binary,
-  // explicitly stated in the constraint matrix. 
-  // See ~/COIN/Examples/Cgl2/cgl2.cpp 
-  // for a general purpose "convert" function. 
-
-  // Reference [BCC]: Balas, Ceria, and Corneujols,
-  // "A lift-and-project cutting plane algorithm
-  // for mixed 0-1 program", Math Prog 58, (1993) 
-  // 295-324.
-
-  // This implementation uses Normalization 1.
-
-  // Given canonical problem and
-  // the lp-relaxation solution, x,
-  // the LAP cut generator attempts to construct
-  // a cut for every x_j such that 0<x_j<1
-  // [BCC:307]
- 
-
-  // x_j is the strictly fractional binary variable
-  // the cut is generated from
-  int j = 0; 
-
-  // Get basic problem information
-  // let Atilde be an m by n matrix
-  const int m = si.getNumRows(); 
-  const int n = si.getNumCols(); 
-  const double * x = si.getColSolution();
-
-  // Remember - Atildes may have gaps..
-  const CoinPackedMatrix * Atilde = si.getMatrixByRow();
-  const double * AtildeElements =  Atilde->getElements();
-  const int * AtildeIndices =  Atilde->getIndices();
-  const CoinBigIndex * AtildeStarts = Atilde->getVectorStarts();
-  const int * AtildeLengths = Atilde->getVectorLengths();  
-  const int AtildeFullSize = AtildeStarts[m];
-  const double * btilde = si.getRowLower();
-
-  // Set up memory for system (10) [BCC:307]
-  // (the problem over the norm intersected 
-  //  with the polar cone)
-  // 
-  // min <<x^T,Atilde^T>,u> + x_ju_0
-  // s.t.
-  //     <B,w> = (0,...,0,beta_,beta)^T
-  //        w  is nonneg for all but the
-  //           last two entries, which are free.
-  // where 
-  // w = (u,v,v_0,u_0)in BCC notation 
-  //      u and v are m-vectors; u,v >=0
-  //      v_0 and u_0 are free-scalars, and
-  //  
-  // B = Atilde^T  -Atilde^T  -e_j e_j
-  //     btilde^T   e_0^T      0   0
-  //     e_0^T      btilde^T   1   0
-
-  // ^T indicates Transpose
-  // e_0 is a (AtildeNCols x 1) vector of all zeros 
-  // e_j is e_0 with a 1 in the jth position
-
-  // Storing B in column order. B is a (n+2 x 2m+2) matrix 
-  // But need to allow for possible gaps in Atilde.
-  // At each iteration, only need to change 2 cols and objfunc
-  // Sane design of OsiSolverInterface does not permit mucking
-  // with matrix.
-  // Because we must delete and add cols to alter matrix,
-  // and we can only add columns on the end of the matrix
-  // put the v_0 and u_0 columns on the end.
-  // rather than as described in [BCC]
- 
-  // Initially allocating B with space for v_0 and u_O cols
-  // but not populating, for efficiency.
-
-  // B without u_0 and v_0 is a (n+2 x 2m) size matrix.
-
-  int twoM = 2*m;
-  int BNumRows = n+2;
-  int BNumCols = twoM+2;
-  int BFullSize = 2*AtildeFullSize+twoM+3;
-  double * BElements = new double[BFullSize];
-  int * BIndices = new int[BFullSize];
-  CoinBigIndex * BStarts = new CoinBigIndex [BNumCols+1];
-  int * BLengths = new int[BNumCols];
-
-
-  int i, ij, k=0;
-  int nPlus1=n+1;
-  int offset = AtildeStarts[m]+m;
-  for (i=0; i<m; i++){
-    for (ij=AtildeStarts[i];ij<AtildeStarts[i]+AtildeLengths[i];ij++){
-      BElements[k]=AtildeElements[ij];
-      BElements[k+offset]=-AtildeElements[ij];
-      BIndices[k]= AtildeIndices[ij];
-      BIndices[k+offset]= AtildeIndices[ij];
-
-      k++;
-    }
-    BElements[k]=btilde[i];
-    BElements[k+offset]=btilde[i];
-    BIndices[k]=n;
-    BIndices[k+offset]=nPlus1;
-    BStarts[i]= AtildeStarts[i]+i;
-    BStarts[i+m]=offset+BStarts[i];// = AtildeStarts[m]+m+AtildeStarts[i]+i
-    BLengths[i]= AtildeLengths[i]+1;
-    BLengths[i+m]= AtildeLengths[i]+1;
-    k++;
-  }
-
-  BStarts[twoM]=BStarts[twoM-1]+BLengths[twoM-1];
-
-  // Cols that will be deleted each iteration
-  int BNumColsLessOne=BNumCols-1;
-  int BNumColsLessTwo=BNumCols-2;
-  const int delCols[2] = {BNumColsLessOne, BNumColsLessTwo};
-
-  // Set lower bound on u and v
-  // u_0, v_0 will be reset as free
-  const double solverINFINITY = si.getInfinity();
-  double * BColLowers = new double[BNumCols];
-  double * BColUppers = new double[BNumCols];
-  CoinFillN(BColLowers,BNumCols,0.0);  
-  CoinFillN(BColUppers,BNumCols,solverINFINITY); 
-
-  // Set row lowers and uppers.
-  // The rhs is zero, for but the last two rows.
-  // For these the rhs is beta_
-  double * BRowLowers = new double[BNumRows];
-  double * BRowUppers = new double[BNumRows];
-  CoinFillN(BRowLowers,BNumRows,0.0);  
-  CoinFillN(BRowUppers,BNumRows,0.0);
-  BRowLowers[BNumRows-2]=beta_;
-  BRowUppers[BNumRows-2]=beta_;
-  BRowLowers[BNumRows-1]=beta_;
-  BRowUppers[BNumRows-1]=beta_;
-
-
-  // Calculate base objective <<x^T,Atilde^T>,u>
-  // Note: at each iteration coefficient u_0
-  //       changes to <x^T,e_j>
-  //       w=(u,v,beta,v_0,u_0) size 2m+3
-  //       So, BOjective[2m+2]=x[j]
-  double * BObjective= new double[BNumCols];
-  double * Atildex = new double[m];
-  CoinFillN(BObjective,BNumCols,0.0);
-  Atilde->times(x,Atildex); // Atildex is size m, x is size n
-  CoinDisjointCopyN(Atildex,m,BObjective); 
-
-  // Number of cols and size of Elements vector
-  // in B without the v_0 and u_0 cols
-  int BFullSizeLessThree = BFullSize-3;
-
-  // Load B matrix into a column orders CoinPackedMatrix
-  CoinPackedMatrix * BMatrix = new CoinPackedMatrix(true, BNumRows,
-						  BNumColsLessTwo, 
-						  BFullSizeLessThree,
-						  BElements,BIndices, 
-						  BStarts,BLengths);
-  // Assign problem into a solver interface 
-  // Note: coneSi will cleanup the memory itself
-  OsiSolverInterface * coneSi = si.clone(false);
-  coneSi->assignProblem (BMatrix, BColLowers, BColUppers, 
-		      BObjective,
-		      BRowLowers, BRowUppers);
-
-  // Problem sense should default to "min" by default, 
-  // but just to be virtuous...
-  coneSi->setObjSense(1.0);
-
-  // The plot outline from here on down:
-  // coneSi has been assigned B without the u_0 and v_0 columns
-  // Calculate base objective <<x^T,Atilde^T>,u>
-  // bool haveWarmStart = false;
-  // For (j=0; j<n, j++)
-  //   if (!isBinary(x_j) || x_j<=0 || x_j>=1) continue;
-  //   // IMPROVEME: if(haveWarmStart) check if j attractive
-  //   add {-e_j,0,-1} matrix column for v_0
-  //   add {e_j,0,0} matrix column for u_0
-  //   objective coefficient for u_0 is  x_j 
-  //   if (haveWarmStart) 
-  //      set warmstart info
-  //   solve min{objw:Bw=0; w>=0,except v_0, u_0 free}
-  //   if (bounded)
-  //      get warmstart info
-  //      haveWarmStart=true;
-  //      ustar = optimal u solution
-  //      ustar_0 = optimal u_0 solution
-  //      alpha^T= <ustar^T,Atilde> -ustar_0e_j^T
-  //      (double check <alpha^T,x> >= beta_ should be violated)
-  //      add <alpha^T,x> >= beta_ to cutset 
-  //   endif
-  //   delete column for u_0 // this deletes all column info.
-  //   delete column for v_0
-  // endFor
-  // clean up memory
-  // return 0;
-
-  int * nVectorIndices = new int[n];
-  CoinIotaN(nVectorIndices, n, 0);
-
-  bool haveWarmStart = false;
-  bool equalObj1, equalObj2;
-  CoinRelFltEq eq;
-
-  double v_0Elements[2] = {-1,1};
-  double u_0Elements[1] = {1};
-
-  CoinWarmStart * warmStart = 0;
-
-  double * ustar = new double[m];
-  CoinFillN(ustar, m, 0.0);
-
-  double* alpha = new double[n];
-  CoinFillN(alpha, n, 0.0);
-
-  for (j=0;j<n;j++){
-    if (!si.isBinary(j)) continue; // Better to ask coneSi? No! 
-                                   // coneSi has no binInfo.
-    equalObj1=eq(x[j],0);
-    equalObj2=eq(x[j],1);
-    if (equalObj1 || equalObj2) continue;
-    // IMPROVEME: if (haveWarmStart) check if j attractive;
-
-    // AskLL:wanted to declare u_0 and v_0 packedVec outside loop
-    // and setIndices, but didn't see a method to do that(?)
-    // (Could "insert". Seems inefficient)
-    int v_0Indices[2]={j,nPlus1};
-    int u_0Indices[1]={j};
-    // 
-    CoinPackedVector  v_0(2,v_0Indices,v_0Elements,false);
-    CoinPackedVector  u_0(1,u_0Indices,u_0Elements,false);
-
-#if CGL_DEBUG
-    const CoinPackedMatrix *see1 = coneSi->getMatrixByRow();
-#endif
-
-    coneSi->addCol(v_0,-solverINFINITY,solverINFINITY,0);
-    coneSi->addCol(u_0,-solverINFINITY,solverINFINITY,x[j]);
-    if(haveWarmStart) {
-      coneSi->setWarmStart(warmStart);
-      coneSi->resolve();
-    }
-    else {
-
-#if CGL_DEBUG
-      const CoinPackedMatrix *see2 = coneSi->getMatrixByRow();
-#endif
-
-      coneSi->initialSolve();
-    }
-    if(coneSi->isProvenOptimal()){
-      warmStart = coneSi->getWarmStart();
-      haveWarmStart=true;
-      const double * wstar = coneSi->getColSolution();
-      CoinDisjointCopyN(wstar, m, ustar);
-      Atilde->transposeTimes(ustar,alpha);
-      alpha[j]+=wstar[BNumCols-1]; 
-      
-#if debug
-      int p;
-      double sum;
-      for(p=0;p<n;p++)sum+=alpha[p]*x[p];
-      if (sum<=beta_){
-	throw CoinError("Cut not violated",
-			"cutGeneration",
-			"CglLiftAndProject");
-      }
-#endif
-
-      // add <alpha^T,x> >= beta_ to cutset
-      OsiRowCut rc;
-      rc.setRow(n,nVectorIndices,alpha);
-      rc.setLb(beta_);
-      rc.setUb(solverINFINITY);
-      cs.insert(rc);
-    }
-    // delete col for u_o and v_0
-    coneSi->deleteCols(2,delCols);
-
-    // clean up memory
-  }
-  // clean up
-  delete [] alpha;
-  delete [] ustar;
-  delete [] nVectorIndices;
-  // BMatrix, BColLowers,BColUppers, BObjective, BRowLowers, BRowUppers
-  // are all freed by OsiSolverInterface destructor (?)
-  delete [] BLengths;
-  delete [] BStarts;
-  delete [] BIndices;
-  delete [] BElements;
-}
-
-//-------------------------------------------------------------------
-// Default Constructor 
-//-------------------------------------------------------------------
-CglLiftAndProject::CglLiftAndProject ()
-:
-CglCutGenerator(),
-beta_(1),
-epsilon_(1.0e-08),
-onetol_(1-epsilon_)
-{
-  // nothing to do here
-}
-
-//-------------------------------------------------------------------
-// Copy constructor 
-//-------------------------------------------------------------------
-CglLiftAndProject::CglLiftAndProject (const CglLiftAndProject & source) :
-   CglCutGenerator(source),
-   beta_(source.beta_),
-   epsilon_(source.epsilon_),
-   onetol_(source.onetol_)
-{
-  // Nothing to do here
-}
-
-//-------------------------------------------------------------------
-// Clone
-//-------------------------------------------------------------------
-CglCutGenerator *
-CglLiftAndProject::clone() const
-{
-  return new CglLiftAndProject(*this);
-}
-
-//-------------------------------------------------------------------
-// Destructor 
-//-------------------------------------------------------------------
-CglLiftAndProject::~CglLiftAndProject ()
-{
-  // Nothing to do here
-}
-
-//----------------------------------------------------------------
-// Assignment operator 
-//-------------------------------------------------------------------
-CglLiftAndProject &
-CglLiftAndProject::operator=(
-                                         const CglLiftAndProject& rhs)
-{
-  if (this != &rhs) {
-    CglCutGenerator::operator=(rhs);
-    beta_=rhs.beta_;
-    epsilon_=rhs.epsilon_;
-    onetol_=rhs.onetol_;
-  }
-  return *this;
-}
-// Create C++ lines to get to current state
-std::string
-CglLiftAndProject::generateCpp( FILE * fp) 
-{
-  CglLiftAndProject other;
-  fprintf(fp,"0#include \"CglLiftAndProject.hpp\"\n");
-  fprintf(fp,"3  CglLiftAndProject liftAndProject;\n");
-  if (beta_!=other.beta_)
-    fprintf(fp,"3  liftAndProject.setBeta(%d);\n",static_cast<int> (beta_));
-  else
-    fprintf(fp,"4  liftAndProject.setBeta(%d);\n",static_cast<int> (beta_));
-  fprintf(fp,"3  liftAndProject.setAggressiveness(%d);\n",getAggressiveness());
-  if (getAggressiveness()!=other.getAggressiveness())
-    fprintf(fp,"3  liftAndProject.setAggressiveness(%d);\n",getAggressiveness());
-  else
-    fprintf(fp,"4  liftAndProject.setAggressiveness(%d);\n",getAggressiveness());
-  return "liftAndProject";
-}
diff --git a/cbits/coin/CglMixedIntegerRounding.cpp b/cbits/coin/CglMixedIntegerRounding.cpp
deleted file mode 100644
--- a/cbits/coin/CglMixedIntegerRounding.cpp
+++ /dev/null
@@ -1,1717 +0,0 @@
-// LAST EDIT: 
-//-----------------------------------------------------------------------------
-// name: Mixed Integer Rounding Cut Generator
-// authors: Joao Goncalves (jog7@lehigh.edu) 
-//          Laszlo Ladanyi (ladanyi@us.ibm.com) 
-// date: August 11, 2004 
-//-----------------------------------------------------------------------------
-// Copyright (C) 2004, International Business Machines Corporation and others. 
-// All Rights Reserved.
-// This code is published under the Eclipse Public License.
-
-//#include <cmath>
-//#include <cstdlib>
-#include <cassert>
-
-#include "CoinPragma.hpp"
-#include "CoinHelperFunctions.hpp"
-#include "CoinPackedMatrix.hpp"
-#include "CoinPackedVector.hpp"
-
-#include "CglMixedIntegerRounding.hpp"
-//#define CGL_DEBUG 1
-//-----------------------------------------------------------------------------
-// Generate Mixed Integer Rounding inequality
-//------------------------------------------------------------------- 
-void
-CglMixedIntegerRounding::generateCuts(const OsiSolverInterface& si,
-				      OsiCuts& cs,
-				      const CglTreeInfo )
-{
-
-  // If the LP or integer presolve is used, then need to redo preprocessing
-  // everytime this function is called. Otherwise, just do once.
-  bool preInit = false;
-  bool preReso = false;
-  si.getHintParam(OsiDoPresolveInInitial, preInit);
-  si.getHintParam(OsiDoPresolveInResolve, preReso);
-  if (preInit == false &&  preReso == false && doPreproc_ == -1 ) { // Do once
-    if (doneInitPre_ == false) {   
-      mixIntRoundPreprocess(si);
-      doneInitPre_ = true;
-    }
-  }
-  else {
-    if(doPreproc_ == 1){ // Do everytime       
-      mixIntRoundPreprocess(si);
-      doneInitPre_ = true;
-    } 
-    else {
-      if (doneInitPre_ == false) {   
-	mixIntRoundPreprocess(si);
-	doneInitPre_ = true;
-      }  
-    }
-  }
-
-  const double* xlp        = si.getColSolution();  // LP solution
-  const double* colUpperBound = si.getColUpper();  // vector of upper bounds
-  const double* colLowerBound = si.getColLower();  // vector of lower bounds
-
-  // get matrix by row
-  const CoinPackedMatrix & tempMatrixByRow = *si.getMatrixByRow();
-  CoinPackedMatrix matrixByRow;
-  matrixByRow.submatrixOf(tempMatrixByRow, numRows_, indRows_);
-  CoinPackedMatrix matrixByCol = matrixByRow;
-  matrixByCol.reverseOrdering();
-  //const CoinPackedMatrix & matrixByRow = *si.getMatrixByRow();
-  const double* LHS        = si.getRowActivity();
-  const double* coefByRow  = matrixByRow.getElements();
-  const int* colInds       = matrixByRow.getIndices();
-  const int* rowStarts     = matrixByRow.getVectorStarts();
-  const int* rowLengths    = matrixByRow.getVectorLengths();
-
-  // get matrix by column
-  //const CoinPackedMatrix & matrixByCol = *si.getMatrixByCol();
-  const double* coefByCol  = matrixByCol.getElements();
-  const int* rowInds       = matrixByCol.getIndices();
-  const int* colStarts     = matrixByCol.getVectorStarts();
-  const int* colLengths    = matrixByCol.getVectorLengths();
-
-
-  generateMirCuts(si, xlp, colUpperBound, colLowerBound,
-		  matrixByRow, LHS, coefByRow,
-		  colInds, rowStarts, rowLengths, //matrixByCol,
-		  coefByCol, rowInds, colStarts, colLengths,
-		  cs);
-}
-
-//-------------------------------------------------------------------
-// Default Constructor 
-//-------------------------------------------------------------------
-CglMixedIntegerRounding::CglMixedIntegerRounding ()
-  :
-  CglCutGenerator()
-{ 
-  gutsOfConstruct(1, true, 1, -1);
-}
-
-
-//-------------------------------------------------------------------
-// Alternate Constructor 
-//-------------------------------------------------------------------
-CglMixedIntegerRounding::CglMixedIntegerRounding (const int maxaggr,
-						  const bool multiply,
-						  const int criterion,
-						  const int preproc)
-  :
-  CglCutGenerator()
-{ 
-  gutsOfConstruct(maxaggr, multiply, criterion, preproc);
-}
-
-
-//-------------------------------------------------------------------
-// Copy constructor 
-//-------------------------------------------------------------------
-CglMixedIntegerRounding::CglMixedIntegerRounding ( 
-				 const CglMixedIntegerRounding & rhs)
-  :
-  CglCutGenerator(rhs)
-{ 
-  gutsOfCopy(rhs);
-}
-
-
-//-------------------------------------------------------------------
-// Clone
-//-------------------------------------------------------------------
-CglCutGenerator *
-CglMixedIntegerRounding::clone() const
-{
-  return new CglMixedIntegerRounding(*this);
-}
-
-//------------------------------------------------------------------
-// Assignment operator 
-//-------------------------------------------------------------------
-CglMixedIntegerRounding &
-CglMixedIntegerRounding::operator=(const CglMixedIntegerRounding& rhs)
-{
-  if (this != &rhs) {
-    gutsOfDelete();
-    CglCutGenerator::operator=(rhs);
-    gutsOfCopy(rhs);
-  }
-  return *this;
-}
-
-
-//-------------------------------------------------------------------
-// Destructor 
-//-------------------------------------------------------------------  
-CglMixedIntegerRounding::~CglMixedIntegerRounding ()
-{
-  gutsOfDelete();
-}
-
-//-------------------------------------------------------------------
-// Construct
-//-------------------------------------------------------------------  
-void
-CglMixedIntegerRounding::gutsOfConstruct (const int maxaggr,
-					  const bool multiply,
-					  const int criterion,
-					  const int preproc)
-{
-  if (maxaggr > 0) {
-    MAXAGGR_ = maxaggr;
-  }
-  else {
-    throw CoinError("Unallowable value. maxaggr must be > 0",
-                      "gutsOfConstruct","CglMixedIntegerRounding");
-  }
-  MULTIPLY_ = multiply;
-  if ((criterion >= 1) && (criterion <= 3)) {
-    CRITERION_ = criterion;
-  }
-  else {
-    throw CoinError("Unallowable value. criterion must be 1, 2 or 3",
-                      "gutsOfConstruct","CglMixedIntegerRounding");
-  }
-  if ((preproc >= -1) && (preproc <= 2)) {
-    doPreproc_ = preproc;
-  }
-  else {
-    throw CoinError("Unallowable value. preproc must be -1, 0 or 1",
-                      "gutsOfConstruct","CglMixedIntegerRounding");
-  }
-  EPSILON_ = 1.0e-6;
-  UNDEFINED_ = -1;
-  TOLERANCE_ = 1.0e-4;
-  numRows_ = 0;
-  numCols_ = 0;
-  doneInitPre_ = false;
-  vubs_ = 0;
-  vlbs_ = 0;
-  rowTypes_ = 0;
-  indRows_ = 0;
-  numRowMix_ = 0;
-  indRowMix_ = 0;
-  numRowCont_ = 0;
-  indRowCont_ = 0;
-  numRowInt_ = 0;
-  indRowInt_ = 0;
-  numRowContVB_ = 0;
-  indRowContVB_ = 0;
-  sense_=NULL;
-  RHS_=NULL;
-}
-
-//-------------------------------------------------------------------
-// Delete
-//-------------------------------------------------------------------  
-void
-CglMixedIntegerRounding::gutsOfDelete ()
-{
-  if (vubs_ != 0) { delete [] vubs_; vubs_ = 0; }
-  if (vlbs_ != 0) { delete [] vlbs_; vlbs_ = 0; }
-  if (rowTypes_ != 0) { delete [] rowTypes_; rowTypes_ = 0; } 
-  if (indRows_ != 0) { delete [] indRows_; indRows_ = 0; }
-  if (indRowMix_ != 0) { delete [] indRowMix_; indRowMix_ = 0; }
-  if (indRowCont_ != 0) { delete [] indRowCont_; indRowCont_ = 0; }
-  if (indRowInt_ != 0) { delete [] indRowInt_; indRowInt_ = 0; }
-  if (indRowContVB_ != 0) { delete [] indRowContVB_; indRowContVB_ = 0; }
-  if (sense_ !=NULL) { delete [] sense_; sense_=NULL;}
-  if (RHS_ !=NULL) { delete [] RHS_; RHS_=NULL;}
-}
-
-//-------------------------------------------------------------------
-// Copy
-//-------------------------------------------------------------------  
-void
-CglMixedIntegerRounding::gutsOfCopy (const CglMixedIntegerRounding& rhs)
-{
-  MAXAGGR_ = rhs.MAXAGGR_;
-  MULTIPLY_ = rhs.MULTIPLY_;
-  CRITERION_ = rhs.CRITERION_;
-  EPSILON_ = rhs.EPSILON_;
-  UNDEFINED_ = rhs.UNDEFINED_;
-  TOLERANCE_ = rhs.TOLERANCE_;
-  doPreproc_ = rhs.doPreproc_;
-  numRows_ = rhs.numRows_;
-  numCols_ = rhs.numCols_;
-  doneInitPre_ = rhs.doneInitPre_;
-  numRowMix_ = rhs.numRowMix_;
-  numRowCont_ = rhs.numRowCont_;
-  numRowInt_ = rhs.numRowInt_;
-  numRowContVB_ = rhs.numRowContVB_;
-
-  if (numCols_ > 0) {
-    vubs_ = new CglMixIntRoundVUB [numCols_];
-    vlbs_ = new CglMixIntRoundVLB [numCols_];
-    CoinDisjointCopyN(rhs.vubs_, numCols_, vubs_);
-    CoinDisjointCopyN(rhs.vlbs_, numCols_, vlbs_);
-  }
-  else {
-    vubs_ = 0;
-    vlbs_ = 0;
-  }
-
-  if (numRows_ > 0) {
-    rowTypes_ = new RowType [numRows_];
-    CoinDisjointCopyN(rhs.rowTypes_, numRows_, rowTypes_);
-    indRows_ = new int [numRows_];
-    CoinDisjointCopyN(rhs.indRows_, numRows_, indRows_);
-    sense_ = CoinCopyOfArray(rhs.sense_,numRows_);
-    RHS_ = CoinCopyOfArray(rhs.RHS_,numRows_);
-  }
-  else {
-    rowTypes_ = 0;
-    indRows_ = 0;
-    sense_=NULL;
-    RHS_=NULL;
-  }
-
-  if (numRowMix_ > 0) {
-    indRowMix_ = new int [numRowMix_];
-    CoinDisjointCopyN(rhs.indRowMix_, numRowMix_, indRowMix_);
-  }
-  else {
-    indRowMix_ = 0;
-  }
-
-  if (numRowCont_ > 0) {
-    indRowCont_ = new int [numRowCont_];
-    CoinDisjointCopyN(rhs.indRowCont_, numRowCont_, indRowCont_);
-    indRowContVB_ = new int [numRowCont_];
-    CoinDisjointCopyN(rhs.indRowContVB_, numRowCont_, indRowContVB_);
-  }
-  else {
-    indRowCont_ = 0;
-    indRowContVB_ = 0;
-  }
-
-  if (numRowInt_ > 0) {
-    indRowInt_ = new int [numRowInt_];
-    CoinDisjointCopyN(rhs.indRowInt_, numRowInt_, indRowInt_);
-  }
-  else {
-    indRowInt_ = 0;
-  }
-
-}
-
-//-------------------------------------------------------------------
-// Do preprocessing
-// It determines the type of each row. It also identifies the variable
-// upper bounds and variable lower bounds.
-//-------------------------------------------------------------------  
-void 
-CglMixedIntegerRounding::
-mixIntRoundPreprocess(const OsiSolverInterface& si)
-{
-  // get matrix stored by row
-  const CoinPackedMatrix & matrixByRow = *si.getMatrixByRow();
-  numRows_ = si.getNumRows();
-  numCols_ = si.getNumCols();
-  const double* coefByRow  = matrixByRow.getElements();
-  const int* colInds       = matrixByRow.getIndices();
-  const int* rowStarts     = matrixByRow.getVectorStarts();
-  const int* rowLengths    = matrixByRow.getVectorLengths();
-  // Get copies of sense and RHS so we can modify if ranges
-  if (sense_) {
-    delete [] sense_;
-    delete [] RHS_;
-  }
-  sense_ = CoinCopyOfArray(si.getRowSense(),numRows_);
-  RHS_  = CoinCopyOfArray(si.getRightHandSide(),numRows_);
-
-  if (rowTypes_ != 0) {
-    delete [] rowTypes_; rowTypes_ = 0;
-  }
-  rowTypes_ = new RowType [numRows_];     // Destructor will free memory
-
-  // Summarize the row type infomation.
-  int numUNDEFINED   = 0;
-  int numVARUB       = 0;
-  int numVARLB       = 0;
-  int numVAREQ       = 0;
-  int numMIX         = 0;
-  int numCONT        = 0;
-  int numINT         = 0;
-  int numOTHER       = 0;
-
-  int iRow;
-  const double* rowActivity        = si.getRowActivity();
-  const double* rowLower        = si.getRowLower();
-  const double* rowUpper        = si.getRowUpper();
-  for (iRow = 0; iRow < numRows_; ++iRow) {
-    // If range then choose which to use
-    if (sense_[iRow]=='R') {
-      if (rowActivity[iRow]-rowLower[iRow]<
-          rowUpper[iRow]-rowActivity[iRow]) {
-        // treat as G row
-        RHS_[iRow]=rowLower[iRow];
-        sense_[iRow]='G';
-      } else {
-        // treat as L row
-        RHS_[iRow]=rowUpper[iRow];
-        sense_[iRow]='L';
-      }
-    }
-    // get the type of a row
-    const RowType rowType = 
-      determineRowType(si, rowLengths[iRow], colInds+rowStarts[iRow],
-		       coefByRow+rowStarts[iRow], sense_[iRow], RHS_[iRow]);
-    // store the type of the current row
-    rowTypes_[iRow] = rowType;
-
-    // Summarize information about row types
-    switch(rowType) {
-    case  ROW_UNDEFINED:
-      ++numUNDEFINED; 
-      break;
-    case  ROW_VARUB:
-      ++numVARUB; 
-      break;
-    case  ROW_VARLB:
-      ++numVARLB; 
-      break;
-    case  ROW_VAREQ:
-      ++numVAREQ; 
-      break;
-    case  ROW_MIX:
-      ++numMIX; 
-      break;
-    case  ROW_CONT:
-      ++numCONT; 
-      break;
-    case  ROW_INT:
-      ++numINT; 
-      break;
-    case  ROW_OTHER:
-      ++numOTHER; 
-      break;
-    default:
-      throw CoinError("Unknown row type", "MixIntRoundPreprocess",
-		      "CglMixedIntegerRounding");
-    }
-  }
-
-  // allocate memory for vector of indices of all rows
-  if (indRows_ != 0) { delete [] indRows_; indRows_ = 0; }
-  if (numRows_ > 0)
-    indRows_ = new int [numRows_];     // Destructor will free memory
-  // allocate memory for vector of indices of rows of type ROW_MIX
-  numRowMix_ = numMIX;
-  if (indRowMix_ != 0) { delete [] indRowMix_; indRowMix_ = 0; }
-  if (numRowMix_ > 0)
-    indRowMix_ = new int [numRowMix_];     // Destructor will free memory
-  // allocate memory for vector of indices of rows of type ROW_CONT
-  numRowCont_ = numCONT;
-  if (indRowCont_ != 0) { delete [] indRowCont_; indRowCont_ = 0; }
-  if (numRowCont_ > 0)
-    indRowCont_ = new int [numRowCont_];     // Destructor will free memory
-  // allocate memory for vector of indices of rows of type ROW_INT
-  numRowInt_ = numINT;
-  if (indRowInt_ != 0) { delete [] indRowInt_; indRowInt_ = 0; }
-  if (numRowInt_ > 0)
-    indRowInt_ = new int [numRowInt_];     // Destructor will free memory
-
-#if CGL_DEBUG
-  std::cout << "The num of rows = "  << numRows_        << std::endl;
-  std::cout << "Summary of Row Type" << std::endl;
-  std::cout << "numUNDEFINED     = " << numUNDEFINED   << std::endl;
-  std::cout << "numVARUB         = " << numVARUB       << std::endl;
-  std::cout << "numVARLB         = " << numVARLB       << std::endl;
-  std::cout << "numVAREQ         = " << numVAREQ       << std::endl;
-  std::cout << "numMIX           = " << numMIX         << std::endl;
-  std::cout << "numCONT          = " << numCONT        << std::endl;
-  std::cout << "numINT           = " << numINT         << std::endl;
-  std::cout << "numOTHER         = " << numOTHER       << std::endl;
-#endif
-
-  //---------------------------------------------------------------------------
-  // Setup  vubs_ and vlbs_
-  if (vubs_ != 0) { delete [] vubs_; vubs_ = 0; }
-  vubs_ = new CglMixIntRoundVUB [numCols_]; // Destructor will free
-  if (vlbs_ != 0) { delete [] vlbs_; vlbs_ = 0; }
-  vlbs_ = new CglMixIntRoundVLB [numCols_]; // Destructor will free
-
-  // Initialization. Altough this has been done in constructor, it is needed
-  // for the case where the mixIntRoundPreprocess is called more than once
-  for (int iCol = 0; iCol < numCols_; ++iCol) {
-    vubs_[iCol].setVar(UNDEFINED_);
-    vlbs_[iCol].setVar(UNDEFINED_);
-  }
-  
-  int countM = 0;
-  int countC = 0;
-  int countI = 0;
-  for ( iRow = 0; iRow < numRows_; ++iRow) {
-
-    RowType rowType = rowTypes_[iRow];
-
-    // fill the vector indRows_ with the indices of all rows
-    indRows_[iRow] = iRow;
-
-    // fill the vector indRowMix_ with the indices of the rows of type ROW_MIX
-    if (rowType == ROW_MIX) {
-      indRowMix_[countM] = iRow;
-      countM++;
-    }
-    // fill the vector indRowCont_ with the indices of rows of type ROW_CONT
-    else if (rowType == ROW_CONT) {
-      indRowCont_[countC] = iRow;
-      countC++;
-    }
-    // fill the vector indRowInt_ with the indices of the rows of type ROW_INT
-    else if (rowType == ROW_INT) {
-      indRowInt_[countI] = iRow;
-      countI++;
-    }
-    // create vectors with variable lower and upper bounds
-    else if ( (rowType == ROW_VARUB) || 
-	      (rowType == ROW_VARLB) || 
-	      (rowType == ROW_VAREQ) )  { 
-      
-      int startPos = rowStarts[iRow];
-      int stopPos  = startPos + rowLengths[iRow];
-      int    xInd = 0,  yInd = 0;   // x is continuous, y is integer
-      double xCoef = 0.0, yCoef = 0.0;
-
-      for (int i = startPos; i < stopPos; ++i) {
-	if ( fabs(coefByRow[i]) > EPSILON_ ) {
-	  if( si.isInteger(colInds[i]) ) {
-	    yInd  = colInds[i];
-	    yCoef = coefByRow[i];
-	  }
-	  else {
-	    xInd  = colInds[i];
-	    xCoef = coefByRow[i];
-	  }
-	}
-      }
-
-      switch (rowType) {
-      case ROW_VARUB:       // Inequality: x <= ? * y
-	vubs_[xInd].setVar(yInd);
-	vubs_[xInd].setVal(-yCoef / xCoef);
-	break;
-      case ROW_VARLB:       // Inequality: x >= ? * y
-	vlbs_[xInd].setVar(yInd);
-	vlbs_[xInd].setVal(-yCoef / xCoef);
-	break;
-      case ROW_VAREQ:       // Inequality: x >= AND <= ? * y
-	vubs_[xInd].setVar(yInd);
-	vubs_[xInd].setVal(-yCoef / xCoef);
-	vlbs_[xInd].setVar(yInd);
-	vlbs_[xInd].setVal(-yCoef / xCoef);
-	break;
-      default:
-        // I am getting compiler bug which gets here - I am disabling - JJF
-	//throw CoinError("Unknown row type: impossible", 
-        //	"MixIntRoundPreprocess",
-        //	"CglMixedIntegerRounding");
-        break;
-      }
-    }
-  }
-
-  // allocate memory for vector of indices of rows of type ROW_CONT
-  // that have at least one variable with variable upper or lower bound
-  if (indRowContVB_ != 0) { delete [] indRowContVB_; indRowContVB_ = 0; }
-  if (numRowCont_ > 0)
-    indRowContVB_ = new int [numRowCont_];     // Destructor will free memory
-  // create vector with rows of type ROW_CONT that have at least
-  // one variable with variable upper or lower bound
-  countC = 0;
-  for (int i = 0; i < numRowCont_; ++i) {
-    int indRow = indRowCont_[i];
-    int jStart = rowStarts[indRow];
-    int jStop = jStart + rowLengths[indRow];
-    for (int j = jStart; j < jStop; ++j) {
-      int indCol = colInds[j];
-      CglMixIntRoundVLB VLB = vlbs_[indCol];
-      CglMixIntRoundVUB VUB = vubs_[indCol];
-      if (( VLB.getVar() != UNDEFINED_ ) || ( VUB.getVar() != UNDEFINED_ ) ){
-	indRowContVB_[countC] = indRow;
-	countC++;
-	break;
-      }
-    }
-  }
-  numRowContVB_ = countC;
-
-}
-
-//-------------------------------------------------------------------
-// Determine the type of a given row 
-//-------------------------------------------------------------------
-CglMixedIntegerRounding::RowType
-CglMixedIntegerRounding::determineRowType(const OsiSolverInterface& si,
-				  const int rowLen, const int* ind, 
-				  const double* coef, const char sense, 
-				  const double rhs) const
-{
-  if (rowLen == 0) 
-    return ROW_UNDEFINED;
-
-  if (sense == 'N' || rhs == si.getInfinity() || rhs == -si.getInfinity())
-    return ROW_OTHER;
-
-  RowType rowType = ROW_UNDEFINED;
-
-  int  numPosInt = 0;      // num of positive integer variables
-  int  numNegInt = 0;      // num of negative integer variables
-  int  numInt    = 0;      // num of integer variables
-  int  numPosCon = 0;      // num of positive continuous variables
-  int  numNegCon = 0;      // num of negative continuous variables
-  int  numCon    = 0;      // num of continuous variables
-
-
-  // Summarize the variable types of the given row.
-  for ( int i = 0; i < rowLen; ++i ) {
-    if ( coef[i] < -EPSILON_ ) {
-      if( si.isInteger(ind[i]) )
-	++numNegInt;
-      else
-	++numNegCon;
-    }
-    else if ( coef[i] > EPSILON_ ) {
-      if( si.isInteger(ind[i]) )
-	++numPosInt;
-      else
-	++numPosCon;
-    }
-  }
-  numInt = numNegInt + numPosInt;
-  numCon = numNegCon + numPosCon;
-
-#if CGL_DEBUG
-  std::cout << "numNegInt = " << numNegInt << std::endl;
-  std::cout << "numPosInt = " << numPosInt << std::endl;
-  std::cout << "numInt = " << numInt << std::endl;
-  std::cout << "numNegCon = " << numNegCon << std::endl;
-  std::cout << "numPosCon = " << numPosCon << std::endl;
-  std::cout << "numCon = " << numCon << std::endl;
-  std::cout << "rowLen = " << rowLen << std::endl;
-#endif
-
-
-  //-------------------------------------------------------------------------
-  // Classify row type based on the types of variables.
-    
-  if ((numInt > 0) && (numCon > 0)) {
-    if ((numInt == 1) && (numCon == 1) && (fabs(rhs) <= EPSILON_)) {
-      // It's a variable bound constraint
-      switch (sense) {
-      case 'L':
-	rowType = numPosCon == 1 ? ROW_VARUB : ROW_VARLB;
-	break;
-      case 'G':
-	rowType = numPosCon == 1 ? ROW_VARLB : ROW_VARUB;
-	break;
-      case 'E':
-        rowType = ROW_VAREQ;
-	break;
-      default:
-	break;
-      }
-    }
-    else {
-      // It's a constraint with continuous and integer variables;
-      // The total number of variables is at least 2
-      rowType = ROW_MIX;
-    }
-  }
-  else if (numInt == 0) {
-    // It's a constraint with only continuous variables
-    rowType = ROW_CONT;
-  }
-  else if ((numCon == 0) && ((sense == 'L') || (sense == 'G'))) {
-    // It's a <= or >= constraint with only integer variables 
-    rowType = ROW_INT;
-  }
-  else
-    // It's a constraint that does not fit the above categories
-    rowType = ROW_OTHER;
-
-
-  return rowType;
-}
-
-//-------------------------------------------------------------------
-// Generate MIR cuts
-//-------------------------------------------------------------------
-void
-CglMixedIntegerRounding::generateMirCuts( 
-			    const OsiSolverInterface& si,
-			    const double* xlp,
-			    const double* colUpperBound,
-			    const double* colLowerBound,
-			    const CoinPackedMatrix& matrixByRow,
-			    const double* LHS,
-			    const double* /*coefByRow*/,
-			    const int* /*colInds*/,
-			    const int* /*rowStarts*/,
-			    const int* /*rowLengths*/,
-			    //const CoinPackedMatrix& matrixByCol,
-			    const double* coefByCol,
-			    const int* rowInds,
-			    const int* colStarts,
-			    const int* colLengths,
-			    OsiCuts& cs ) const
-{
-
-#if CGL_DEBUG
-  // Open debug data file; incorporate solver name so we get separate files
-  // when running unit test.
-  std::string dbgFname ;
-  si.getStrParam(OsiSolverName,dbgFname) ;
-  dbgFname = "mir_"+dbgFname+"_stats.dat" ;
-  std::ofstream fout(dbgFname.c_str()) ;
-#endif
-
-  // Define upper limit for the loop where the cMIRs are constructed
-  int upperLimit;
-  if (MULTIPLY_)
-    upperLimit = 2;
-  else
-    upperLimit = 1;
-  
-  // create a vector with the columns that were used in the aggregation
-  int* listColsSelected = new int[MAXAGGR_];
-  // create a vector with the rows that were aggregated
-  int* listRowsAggregated = new int[MAXAGGR_];
-  // create a vector with the LP solutions of the slack variables
-  double* xlpExtra = new double[MAXAGGR_];
-
-  // loop until maximum number of aggregated rows is reached or a 
-  // violated cut is found
-  int numRowMixAndRowContVB = numRowMix_ + numRowContVB_;
-  int numRowMixAndRowContVBAndRowInt = numRowMixAndRowContVB + numRowInt_;
-  for (int iRow = 0; iRow < numRowMixAndRowContVBAndRowInt; ++iRow) {
-
-    int rowSelected;  // row selected to be aggregated next
-    int colSelected;  // column selected for pivot in aggregation
-    CoinPackedVector rowAggregated;
-    double rhsAggregated;
-    // create a set with the indices of rows selected
-    std::set<int> setRowsAggregated;
-
-    // loop until the maximum number of aggregated rows is reached
-    for (int iAggregate = 0; iAggregate < MAXAGGR_; ++iAggregate) {
-
-      if (iAggregate == 0) {
-
-	// select row
-	if (iRow < numRowMix_) {
-	  rowSelected = indRowMix_[iRow];
-	}
-	else if (iRow < numRowMixAndRowContVB) {
-	  rowSelected = indRowContVB_[iRow - numRowMix_];
-	}
-	else {
-	  rowSelected = indRowInt_[iRow - numRowMixAndRowContVB];
-	}
-
-	copyRowSelected(iAggregate, rowSelected, setRowsAggregated,
-			listRowsAggregated, xlpExtra, sense_[rowSelected], 
-			RHS_[rowSelected], LHS[rowSelected], 
-			matrixByRow, rowAggregated, rhsAggregated);
-
-      } 
-      else {
-
-	// search for a row to aggregate
-	bool foundRowToAggregate = selectRowToAggregate(
-				        si, rowAggregated,
-					colUpperBound, colLowerBound, 
-					setRowsAggregated, xlp, 
-					coefByCol, rowInds, colStarts,
-					colLengths, 
-					rowSelected, colSelected);
-
-	// if finds row to aggregate, compute aggregated row
-	if (foundRowToAggregate) {
-
-	  CoinPackedVector rowToAggregate;
-	  double rhsToAggregate;
-
-	  listColsSelected[iAggregate] = colSelected;
-
-	  copyRowSelected(iAggregate, rowSelected, setRowsAggregated,
-			  listRowsAggregated, xlpExtra, sense_[rowSelected], 
-			  RHS_[rowSelected], LHS[rowSelected], 
-			  matrixByRow, rowToAggregate, rhsToAggregate);
-
-	  // call aggregate row heuristic
-	  aggregateRow(colSelected, rowToAggregate, rhsToAggregate, 
-		       rowAggregated, rhsAggregated);
-
-	}
-	else
-	  break;
-      }
-
-
-      // construct cMIR with current rowAggregated
-      // and, if upperLimit=2 construct also a cMIR with 
-      // the current rowAggregated multiplied by -1
-      for (int i = 0; i < upperLimit; ++i) {
-      
-	// create vector for mixed knapsack constraint
-	CoinPackedVector rowToUse = rowAggregated;
-	double rhsMixedKnapsack = rhsAggregated;
-	if (i == 1) {
-	  rowToUse *= (-1.0);
-	  rhsMixedKnapsack *= (-1.0);
-	}	  
-	CoinPackedVector mixedKnapsack;
-	double sStar = 0.0;
-
-	// create vector for the continuous variables in s
-	CoinPackedVector contVariablesInS;
-
-	// call bound substitution heuristic
-	bool foundMixedKnapsack = boundSubstitution(
-					si, rowToUse, 
-					xlp, xlpExtra, 
-					colUpperBound, colLowerBound,
-					mixedKnapsack, rhsMixedKnapsack, 
-					sStar, contVariablesInS);
-        // may want some limit?
-        if (mixedKnapsack.getNumElements()>25000) {
-#if CGL_DEBUG	  
-	  std::cout << "mixed knapsack has " 
-                    <<mixedKnapsack.getNumElements()<<" elements - rhs is "
-                    <<rhsMixedKnapsack
-                    << std::endl;
-#endif
-	  continue;
-	}
-          
-	// if it did not find a mixed knapsack it is because there is at
-	// least one integer variable with lower bound different than zero
-	// or there are no integer or continuous variables.
-	// In this case, we continue without trying to generate a c-MIR
-	if (!foundMixedKnapsack) {
-#if CGL_DEBUG	  
-	  std::cout << "couldn't create mixed knapsack" << std::endl;
-#endif
-	  continue;
-	}
-
-	OsiRowCut cMirCut;
-
-	// Find a c-MIR cut with the current mixed knapsack constraint
-	bool hasCut = cMirSeparation(si, matrixByRow, rowToUse,
-				     listRowsAggregated, sense_, RHS_,
-				     //coefByRow, colInds, rowStarts, rowLengths,
-				     xlp, sStar, colUpperBound, colLowerBound, 
-				     mixedKnapsack,
-				     rhsMixedKnapsack, contVariablesInS,
-				     cMirCut);
-
-#if CGL_DEBUG
-	// PRINT STATISTICS
-	printStats(fout, hasCut, si, rowAggregated, rhsAggregated, xlp,
-		   xlpExtra, listRowsAggregated, listColsSelected, 
-		   iAggregate+1, colUpperBound, colLowerBound );
-#endif
-
-	// if a cut was found, insert it into cs
-	if (hasCut)  {
-#if CGL_DEBUG
-	  std::cout << "MIR cut generated " << std::endl;
-#endif
-	  cs.insert(cMirCut);
-	}
-
-      }
-	
-    }
-
-  }
-
-  // free memory
-  delete [] listColsSelected; listColsSelected = 0;
-  delete [] listRowsAggregated; listRowsAggregated = 0;
-  delete [] xlpExtra; xlpExtra = 0;
-  
-#if CGL_DEBUG
-  // CLOSE FILE
-  fout.close();
-#endif
-
-  return;
-
-}
-
-//-------------------------------------------------------------------
-// Copy row selected to CoinPackedVector
-//-------------------------------------------------------------------
-void
-CglMixedIntegerRounding::copyRowSelected(
-			    const int iAggregate,
-			    const int rowSelected,
-			    std::set<int>& setRowsAggregated,
-			    int* listRowsAggregated,
-			    double* xlpExtra,
-			    const char sen,
-			    const double rhs,
-			    const double lhs,
-			    const CoinPackedMatrix& matrixByRow,
-			    CoinPackedVector& rowToAggregate,
-			    double& rhsToAggregate) const
-{
-
-  // copy the row selected to a vector of type CoinPackedVector
-  const CoinShallowPackedVector reqdBySunCC = matrixByRow.getVector(rowSelected);
-  rowToAggregate = reqdBySunCC ;
-  rhsToAggregate = rhs;
-
-  // update list of indices of rows selected
-  setRowsAggregated.insert(rowSelected);
-  listRowsAggregated[iAggregate] = rowSelected;
-
-  // Add a slack variable if needed and compute its current value
-  if (sen == 'L') {
-    rowToAggregate.insert(numCols_ + iAggregate, 1);
-    xlpExtra[iAggregate] = rhs - lhs;
-  }
-  else if (sen == 'G') {
-    rowToAggregate.insert(numCols_ + iAggregate, -1);
-    xlpExtra[iAggregate] = lhs - rhs;
-  }
-
-}
-
-//-------------------------------------------------------------------
-// Construct the set P* and select a row to aggregate
-//-------------------------------------------------------------------
-bool
-CglMixedIntegerRounding::selectRowToAggregate( 
-			    const OsiSolverInterface& si,
-			    const CoinPackedVector& rowAggregated,
-			    const double* colUpperBound,
-			    const double* colLowerBound,
-			    const std::set<int>& setRowsAggregated,
-			    const double* xlp, const double* coefByCol,
-			    const int* rowInds, const int* colStarts,
-			    const int* colLengths,
-			    int& rowSelected,
-			    int& colSelected ) const
-{
-
-  bool foundRowToAggregate = false;
-
-  double deltaMax = 0.0;  // maximum delta
-  const int numColsAggregated = rowAggregated.getNumElements();
-  const int *rowAggregatedIndices = rowAggregated.getIndices();
-  const double *rowAggregatedElements = rowAggregated.getElements();  
-
-  for (int j = 0; j < numColsAggregated; ++j) {
-
-    // store the index and coefficient of column j
-    int indCol = rowAggregatedIndices[j];
-    if (indCol >= numCols_) continue;
-    double coefCol = rowAggregatedElements[j];
-
-    // Consider only continuous variables
-    if ( (!si.isContinuous(indCol)) || (fabs(coefCol) < EPSILON_)) continue;
-
-    // Compute current lower bound
-    CglMixIntRoundVLB VLB = vlbs_[indCol];
-    double LB = ( VLB.getVar() != UNDEFINED_ ) ? 
-                      VLB.getVal() * xlp[VLB.getVar()] : colLowerBound[indCol];
-    
-    // Compute current upper bound
-    CglMixIntRoundVUB VUB = vubs_[indCol];
-    double UB = ( VUB.getVar() != UNDEFINED_ ) ? 
-                      VUB.getVal() * xlp[VUB.getVar()] : colUpperBound[indCol];
-
-    // Compute distances from current solution to upper and lower bounds
-    double delta = CoinMin(xlp[indCol] - LB, UB - xlp[indCol]);
-
-    // In case this variable is acceptable look for possible rows
-    if (delta > deltaMax) {
-
-      int iStart = colStarts[indCol];
-      int iStop  = iStart + colLengths[indCol];
-      //      int count = 0;
-
-      //      std::vector<int> rowPossible;
-
-      // find a row to use in aggregation
-      for (int i = iStart; i < iStop; ++i) {
-	int rowInd = rowInds[i];
-	if (setRowsAggregated.find(rowInd) == setRowsAggregated.end()) {
-	  // if the row was not already selected, select it
-	  RowType rType = rowTypes_[rowInd];
-	  if ( ((rType == ROW_MIX) || (rType == ROW_CONT)) 
-	       && (fabs(coefByCol[i]) > EPSILON_) ) {
-	    //	    rowPossible.push_back(rowInd);
-	    rowSelected = rowInd;
-	    deltaMax = delta;
-	    colSelected = indCol;
-	    foundRowToAggregate = true;
-	    //count++;
-	    break;
-	  }
-	}
-      }
-
-      //      if (count > 0)
-      //	rowSelected = rowPossible[rand() % count];
-      //      std::cout << count << std::endl;
-    }
-	
-  }
-
-  return foundRowToAggregate;
-
-}
-      
-//-------------------------------------------------------------------
-// Aggregate the selected row with the current aggregated row
-//-------------------------------------------------------------------
-void
-CglMixedIntegerRounding::aggregateRow( 
-			    const int colSelected,
-			    CoinPackedVector& rowToAggregate, double rhs,
-			    CoinPackedVector& rowAggregated, 
-			    double& rhsAggregated ) const
-{
-
-  // quantity to multiply by the coefficients of the row to aggregate
-  double multiCoef = rowAggregated[colSelected] / rowToAggregate[colSelected];
-
-  rowToAggregate *= multiCoef; 
-  rhs *= multiCoef;
-
-  rowAggregated = rowAggregated - rowToAggregate;
-  rhsAggregated -= rhs;
-
-}
-
-//-------------------------------------------------------------------
-// Choose the bound substitution based on the criteria defined by the user
-//-------------------------------------------------------------------
-inline bool
-CglMixedIntegerRounding::isLowerSubst(const double inf, 
-				      const double aj,
-				      const double xlp, 
-				      const double LB, 
-				      const double UB) const
-{
-  if (CRITERION_ == 1) {
-    // criterion 1 (the same as criterion (a) in the paper)
-    return xlp - LB < UB - xlp;
-  }
-  else {
-    if (UB == inf || xlp == LB) 
-      return true;
-    if (LB == -inf || xlp == UB)
-      return false;
-    if (CRITERION_ == 2) 
-      // criterion 2 (the same as criterion (b) in the paper)
-      return aj < 0;
-    else
-      // criterion 3 (the same as criterion (c) in the paper)
-      return aj > 0;
-  }
-}
-
-
-
-//-------------------------------------------------------------------
-// Bound substitution heuristic
-//-------------------------------------------------------------------
-bool
-CglMixedIntegerRounding::boundSubstitution( 
-			    const OsiSolverInterface& si,
-			    const CoinPackedVector& rowAggregated,
-			    const double* xlp,
-			    const double* xlpExtra,
-			    const double* colUpperBound,
-			    const double* colLowerBound,
-			    CoinPackedVector& mixedKnapsack,
-			    double& rhsMixedKnapsack, double& sStar,
-			    CoinPackedVector& contVariablesInS ) const
-{
-
-  bool generated = false;
-  const int numColsAggregated = rowAggregated.getNumElements();
-  const int *rowAggregatedIndices = rowAggregated.getIndices();
-  const double *rowAggregatedElements = rowAggregated.getElements();  
-
-  // go through all the variables and if it is continuous and delta is 
-  // negative, store variable in the vector contVariablesInS.
-  // If it is integer, store variable in the vector mixedKnapsack
-  int numCont = 0;
-  int j;
-  for ( j = 0; j < numColsAggregated; ++j) {
-
-    // get index and coefficient of column j in the aggregated row
-    const int indCol = rowAggregatedIndices[j];
-    const double coefCol = rowAggregatedElements[j];
-
-    // if the lower bound is equal to the upper bound, remove variable
-    if ( (indCol < numCols_) &&
-	 (colLowerBound[indCol] == colUpperBound[indCol]) ) {
-      rhsMixedKnapsack -= coefCol * colLowerBound[indCol];
-      continue;
-    }
-
-    if (fabs(coefCol) < EPSILON_) continue;
-    // set the coefficients of the integer variables
-    if ( (indCol < numCols_)  && (!si.isContinuous(indCol)) ) {
-      // Copy the integer variable to the vector mixedKnapsack
-      if (mixedKnapsack.isExistingIndex(indCol)) {
-	const int index = mixedKnapsack.findIndex(indCol);
-	mixedKnapsack.setElement(index, mixedKnapsack[indCol] + coefCol);
-      }
-      else
-	mixedKnapsack.insert(indCol, coefCol);
-      continue;
-    }
-
-    // Select the continuous variables and copy the ones in s to 
-    // the vector contVariablesInS
-    if (indCol < numCols_) {  // variable is model variable
-
-      // Compute lower bound for variable indCol
-      const CglMixIntRoundVLB VLB = vlbs_[indCol];
-      const double LB = ( VLB.getVar() != UNDEFINED_ ) ? 
-	        VLB.getVal() * xlp[VLB.getVar()] : colLowerBound[indCol];
-    
-      // Compute upper bound for variable indCol
-      const CglMixIntRoundVUB VUB = vubs_[indCol];
-      const double UB = ( VUB.getVar() != UNDEFINED_ ) ? 
-	        VUB.getVal() * xlp[VUB.getVar()] : colUpperBound[indCol];
-
-      // if both bounds are infinite, then we cannot form a mixed knapsack
-      if ( (LB == -1.0 * si.getInfinity()) &&
-	   (UB == si.getInfinity()) ) {
-#if CGL_DEBUG
-	std::cout << "continuous var with infinite bounds. " <<
-                     "Cannot form mixed Knapsack = " << std::endl;
-#endif
-	return generated;
-      }
-
-      // Select the bound substitution
-      if (isLowerSubst(si.getInfinity(), rowAggregatedElements[j],
-			 xlp[indCol], LB, UB)) {
-	if (VLB.getVar() != UNDEFINED_ ) {
-	  const int indVLB = VLB.getVar();
-	  if (mixedKnapsack.isExistingIndex(indVLB)) {
-	    const int index = mixedKnapsack.findIndex(indVLB);
-	    mixedKnapsack.setElement(index, mixedKnapsack[indVLB] + 
-				     coefCol * VLB.getVal());
-	  }
-	  else
-	    mixedKnapsack.insert(indVLB, coefCol * VLB.getVal());
-	}
-	else {
-	  rhsMixedKnapsack -= coefCol * LB;
-	}
-	// Update sStar
-	if (coefCol < -EPSILON_) {
-	  contVariablesInS.insert(indCol, coefCol);
-	  sStar -= coefCol * (xlp[indCol] - LB);
-	  numCont++;
-	}
-      }
-      else {
-	if (VUB.getVar() != UNDEFINED_ ) {
-	  const int indVUB = VUB.getVar();
-	  if (mixedKnapsack.isExistingIndex(indVUB)) {
-	    const int index = mixedKnapsack.findIndex(indVUB);
-	    mixedKnapsack.setElement(index, mixedKnapsack[indVUB] + 
-				     coefCol * VUB.getVal());
-	  }
-	  else
-	    mixedKnapsack.insert(indVUB, coefCol * VUB.getVal());
-	}
-	else {
-	  rhsMixedKnapsack -= coefCol * UB;
-	}
-	// Update sStar
-	if (coefCol > EPSILON_) {
-	  contVariablesInS.insert(indCol, - coefCol);
-	  sStar += coefCol * (UB - xlp[indCol]);
-	  numCont++;
-	}
-      }
-    }
-    else {  // variable is slack variable
-      // in this case the LB = 0 and the UB = infinity
-      // Update sStar
-      const double tLB = xlpExtra[indCol - numCols_];
-      if (coefCol < -EPSILON_) {
-	contVariablesInS.insert(indCol, coefCol);
-	sStar -= coefCol * tLB;
-	numCont++;
-      }
-    }
-
-  }
-
-  // if there are no continuous variables to form s, then we stop
-#if CGL_DEBUG
-  std::cout << "# of continuous var in mixedKnapsack = " << numCont <<
-    std::endl;
-#endif
-  if (numCont == 0) return generated;
-
-  // check that the integer variables have lower bound equal to zero
-  const int numInt = mixedKnapsack.getNumElements();
-  // if there are not integer variables in mixedKnapsack, then we stop
-  // CAUTION: all the coefficients could be zero
-#if CGL_DEBUG
-  std::cout << "# of integer var in mixedKnapsack = " << numInt <<
-    std::endl;
-#endif
-  if (numInt == 0) return generated;
-  const int *knapsackIndices = mixedKnapsack.getIndices();
-  const double *knapsackElements = mixedKnapsack.getElements();  
-
-  for ( j = 0; j < numInt; ++j) {
-    // if the coefficient is zero, disregard
-    if (fabs(knapsackElements[j]) < EPSILON_) continue;
-    // if the lower bound is not zero, then we stop
-    if (fabs(colLowerBound[knapsackIndices[j]]) > EPSILON_) return generated;
-  }
-  // if the lower bounds of all integer variables are zero, proceed
-  generated = true;
-  return generated;
-
-}
-
-//-------------------------------------------------------------------
-// c-MIR separation heuristic
-//-------------------------------------------------------------------
-bool
-CglMixedIntegerRounding::cMirSeparation( 
-			    const OsiSolverInterface& si,
-			    const CoinPackedMatrix& matrixByRow,
-			    const CoinPackedVector& rowAggregated,
-			    const int* listRowsAggregated,
-			    const char* sense, const double* RHS,
-			    //const double* coefByRow,
-			    //const int* colInds, const int* rowStarts,
-			    //const int* rowLengths,
-			    const double* xlp, const double sStar,
-			    const double* colUpperBound,
-			    const double* colLowerBound,
-			    const CoinPackedVector& mixedKnapsack,
-			    const double& rhsMixedKnapsack,
-			    const CoinPackedVector& contVariablesInS,
-			    OsiRowCut& cMirCut) const
-{
-
-  bool generated = false;
-  double numeratorBeta = rhsMixedKnapsack;
-  CoinPackedVector cMIR = mixedKnapsack;
-  double rhscMIR;
-  double maxViolation = 0.0;
-  double bestDelta = 0.0;
-  CoinPackedVector bestCut;
-  double rhsBestCut = 0.0;
-  double sCoefBestCut = 0.0;
-  const int numInt = mixedKnapsack.getNumElements();  
-  const int *knapsackIndices = mixedKnapsack.getIndices();
-  const double *knapsackElements = mixedKnapsack.getElements();  
-  const int *contVarInSIndices = contVariablesInS.getIndices();
-  const double *contVarInSElements = contVariablesInS.getElements();
-
-  // Construct set C, T will be the rest.
-  // Also, for T we construct a CoinPackedVector named complT which
-  // contains the vars in T that are strictly between their bounds
-  std::set<int> setC;
-  CoinPackedVector complT;
-  int j;
-  for ( j = 0; j < numInt; ++j) {
-    const int indCol = knapsackIndices[j];
-    // if the upper bound is infinity, then indCol is in T and cannot
-    // be in complT
-    if (colUpperBound[indCol] != si.getInfinity()) {
-      if (xlp[indCol] >= colUpperBound[indCol] / 2.0) {
-	setC.insert(j);
-	numeratorBeta -= knapsackElements[j] * colUpperBound[indCol];
-      } else {
-	if ( (xlp[indCol] <= EPSILON_) || 
-	     (xlp[indCol] >= colUpperBound[indCol] - EPSILON_))
-	  continue;
-	complT.insert(j, fabs(xlp[indCol] - colUpperBound[indCol]/2));
-      }
-    }
-  }
-
-  // Sort the indices in complT by nondecreasing values 
-  // (which are  $|y^*_j-u_j/2|$)
-  if (complT.getNumElements() > 0) {
-    complT.sortIncrElement();
-  }
-
-  // Construct c-MIR inequalities and take the one with the largest violation
-  for ( j = 0; j < numInt; ++j) {
-    int indCol = knapsackIndices[j];
-    if ( (xlp[indCol] <= EPSILON_) || 
-	 (xlp[indCol] >= colUpperBound[indCol] - EPSILON_))
-      continue;
-    double delta = knapsackElements[j];
-    // delta has to be positive
-    if (delta <= EPSILON_) continue;
-
-    double violation = 0.0;
-    double sCoef = 0.0;
-
-    // form a cMIR inequality
-    cMirInequality(numInt, delta, numeratorBeta, knapsackIndices, 
-		   knapsackElements, xlp, sStar, colUpperBound, setC, cMIR,
-		   rhscMIR, sCoef, violation);
-
-    // store cut if it is the best found so far
-    if (violation > maxViolation + EPSILON_) {
-      bestCut = cMIR;
-      rhsBestCut = rhscMIR;
-      sCoefBestCut = sCoef;
-      maxViolation = violation;
-      bestDelta = delta;
-    }
-  }
-
-  // if no violated inequality has been found, exit now
-  if (maxViolation == 0.0) return generated;
-
-  // improve the best violated inequality.
-  // try to divide delta by 2, 4 or 8 and see if increases the violation
-  double deltaBase = bestDelta;
-  for (int multFactor = 2; multFactor <= 8; multFactor *= 2) {
-    double delta = deltaBase / multFactor;
-    double violation = 0.0;
-    double sCoef = 0.0;
-
-    // form a cMIR inequality
-    cMirInequality(numInt, delta, numeratorBeta, knapsackIndices, 
-		   knapsackElements, xlp, sStar, colUpperBound, setC, cMIR,
-		   rhscMIR, sCoef, violation);
-
-    // store cut if it is the best found so far
-    if (violation > maxViolation + EPSILON_) {
-      bestCut = cMIR;
-      rhsBestCut = rhscMIR;
-      sCoefBestCut = sCoef;
-      maxViolation = violation;
-      bestDelta = delta;
-    }
-  }
-
-  // improve cMIR for the best delta
-  // complT contains indices into mixedKnapsack for the variables
-  // which may be complemented and they are already appropriately
-  // sorted.
-  const int complTSize = complT.getNumElements();
-  if (complTSize > 0) {
-    const int *complTIndices = complT.getIndices();
-    for (int j = 0; j < complTSize; ++j) {
-      // move variable in set complT from set T to set C
-      int jIndex = complTIndices[j];
-      int indCol = knapsackIndices[jIndex];
-      // do nothing if upper bound is infinity
-      if (colUpperBound[indCol] >= si.getInfinity()) continue;
-      setC.insert(jIndex);
-      double violation = 0.0;
-      double sCoef = 0.0;
-      double localNumeratorBeta = numeratorBeta -
-	mixedKnapsack[indCol] * colUpperBound[indCol];
-
-      // form a cMIR inequality
-      cMirInequality(numInt, bestDelta, localNumeratorBeta, knapsackIndices, 
-		     knapsackElements, xlp, sStar, colUpperBound, setC, cMIR,
-		     rhscMIR, sCoef, violation);
-
-      // store cut if it is the best found so far; otherwise, move the variable
-      // that was added to set C back to set T
-      if (violation > maxViolation + EPSILON_) {
-	bestCut = cMIR;
-	rhsBestCut = rhscMIR;
-	sCoefBestCut = sCoef;
-	maxViolation = violation;
-	numeratorBeta = localNumeratorBeta;
-      }
-      else
-	setC.erase(jIndex);
-    }
-  }
-
-  // write the best cut found with the model variables
-  int numCont = contVariablesInS.getNumElements();
-  for ( j = 0; j < numCont; ++j) {
-    int indCol = contVarInSIndices[j];
-    double coefCol = contVarInSElements[j];
-      
-    if (indCol < numCols_) {  // variable is model variable
-
-      // Compute lower bound for variable indCol
-      CglMixIntRoundVLB VLB = vlbs_[indCol];
-      double LB = ( VLB.getVar() != UNDEFINED_ ) ? 
-	VLB.getVal() * xlp[VLB.getVar()] : colLowerBound[indCol];
-    
-      // Compute upper bound for variable indCol
-      CglMixIntRoundVUB VUB = vubs_[indCol];
-      double UB = ( VUB.getVar() != UNDEFINED_ ) ? 
-	VUB.getVal() * xlp[VUB.getVar()] : colUpperBound[indCol];
-
-      // Select the bound substitution
-      if (isLowerSubst(si.getInfinity(), rowAggregated[indCol],
-			 xlp[indCol], LB, UB)) { 
-	if (VLB.getVar() != UNDEFINED_ ) {
-	  int indVLB = VLB.getVar();
-	  if (bestCut.isExistingIndex(indVLB)){
-	    int index = bestCut.findIndex(indVLB);
-	    bestCut.setElement(index, bestCut[indVLB] - 
-			       sCoefBestCut * coefCol * VLB.getVal());
-	  }
-	  else
-	    bestCut.insert(indVLB, - sCoefBestCut * coefCol * VLB.getVal());
-	  bestCut.insert(indCol, sCoefBestCut * coefCol);
-	}
-	else {
-	  rhsBestCut += sCoefBestCut * coefCol * colLowerBound[indCol];
-	  bestCut.insert(indCol, sCoefBestCut * coefCol);
-	}
-      }
-      else {
-	if (VUB.getVar() != UNDEFINED_ ) {
-	  int indVUB = VUB.getVar();
-	  if (bestCut.isExistingIndex(indVUB)){
-	    int index = bestCut.findIndex(indVUB);
-	    bestCut.setElement(index, bestCut[indVUB] + 
-			       sCoefBestCut * coefCol * VUB.getVal());
-	  }
-	  else
-	    bestCut.insert(indVUB, sCoefBestCut * coefCol * VUB.getVal());
-	  bestCut.insert(indCol, - sCoefBestCut * coefCol);
-	}
-	else {
-	  rhsBestCut -= sCoefBestCut * coefCol * colUpperBound[indCol];
-	  bestCut.insert(indCol, - sCoefBestCut * coefCol);
-	}
-      }
-    }
-    else {  // variable is slack variable
-      // in this case the LB = 0 and the UB = infinity
-      // copy the row selected to a vector of type CoinPackedVector
-      const int iRow = listRowsAggregated[indCol - numCols_];
-      const CoinShallowPackedVector reqdBySunCC = matrixByRow.getVector(iRow);
-      CoinPackedVector row = reqdBySunCC ;
-      double rhs     = RHS[iRow];
-
-      if (sense[iRow] == 'L') {
-	// if it is a <= inequality, the coefficient of the slack is 1
-	row *= (- sCoefBestCut * coefCol);
-	rhs *= (- sCoefBestCut * coefCol);
-      }
-      else {
-        assert (sense[iRow]=='G');
-	// if it is a <= inequality, the coefficient of the slack is -1
-	row *= (sCoefBestCut * coefCol);
-	rhs *= (sCoefBestCut * coefCol);
-      }
-
-      rhsBestCut += rhs;
-      bestCut = bestCut + row;
-    }
-  }
-
-  // Check the violation of the cut after it is written with the original
-  // variables.
-  int cutLen = bestCut.getNumElements();
-  int* cutInd = bestCut.getIndices();
-  double* cutCoef = bestCut.getElements();
-  double cutRHS = rhsBestCut;
-  double violation = 0.0;
-  double normCut = 0.0;
-  // Also weaken by small coefficients
-  int n=0;
-  for ( j = 0; j < cutLen; ++j) {
-    double value = cutCoef[j];
-    int column = cutInd[j];
-    if (fabs(value)>1.0e-12) {
-      violation += cutCoef[j] * xlp[column];
-      normCut += cutCoef[j] * cutCoef[j];
-      cutCoef[n]=value;
-      cutInd[n++]=column;
-    } else if (value) {
-      // Weaken
-      if (value>0.0) {
-        // Allow for at lower bound
-        cutRHS -= value*colLowerBound[column];
-      } else {
-        // Allow for at upper bound
-        cutRHS -= value*colUpperBound[column];
-      }
-    }
-  }
-  cutLen=n;
-  violation -= cutRHS;
-  violation /= sqrt(normCut);
-
-  if ( violation > TOLERANCE_ ) {
-    cMirCut.setRow(cutLen, cutInd, cutCoef);
-    cMirCut.setLb(-1.0 * si.getInfinity());
-    cMirCut.setUb(cutRHS);
-    cMirCut.setEffectiveness(violation);
-#ifdef CGL_DEBUG
-    {
-      for (int k=0; k<cutLen; k++){
-	assert(cutInd[k]>=0);
-	assert(cutCoef[k]);
-        assert (fabs(cutCoef[k])>1.0e-12);
-      }
-    }
-#endif
-    generated = true;
-  }
-
-  return generated;
-
-}
-
-//-------------------------------------------------------------------
-// construct a c-MIR inequality
-//-------------------------------------------------------------------
-void
-CglMixedIntegerRounding::cMirInequality(
-				  const int numInt, 
-				  const double delta,
-				  const double numeratorBeta,
-				  const int *knapsackIndices,
-				  const double* knapsackElements,
-				  const double* xlp, 
-				  const double sStar,	       
-				  const double* colUpperBound,
-				  const std::set<int>& setC,
-				  CoinPackedVector& cMIR,
-				  double& rhscMIR,
-				  double& sCoef,
-				  double& violation) const
-{
-
-      // form a cMIR inequality
-      double beta = numeratorBeta / delta;
-      double f = beta - floor(beta);
-      rhscMIR = floor(beta);
-      double normCut = 0.0;
-      // coefficients of variables in set T
-      for (int i = 0; i < numInt; ++i) {
-	const int iIndex = knapsackIndices[i];
-	double G = 0.0;
-	if (setC.find(i) == setC.end()) {
-	  // i is not in setC, i.e., it is in T
-	  G = functionG(knapsackElements[i] / delta, f);
-	  violation += (G * xlp[iIndex]);
-	  normCut += G * G;
-	  cMIR.setElement(i, G);
-	} else {
-	  G = functionG( - knapsackElements[i] / delta, f);
-	  violation -= (G * xlp[iIndex]);
-	  normCut += G * G;
-	  rhscMIR -= G * colUpperBound[iIndex];
-	  cMIR.setElement(i, -G);	  
-	}
-      }
-      sCoef = 1.0 / (delta * (1.0 - f));
-      violation -= (rhscMIR + sCoef * sStar);
-      normCut += sCoef * sCoef;
-      violation /= sqrt(normCut);
-
-}
-
-
-//-------------------------------------------------------------------
-// function G for computing coefficients in cMIR inequality
-//-------------------------------------------------------------------
-inline double
-CglMixedIntegerRounding::functionG( const double d, const double f ) const
-{
-  double delta = d - floor(d) - f;
-  if (delta > EPSILON_)
-    return floor(d) + delta / (1 - f);
-  else
-    return floor(d);
-}
-
-//-------------------------------------------------------------------
-// Printing statistics
-//-------------------------------------------------------------------
-void
-CglMixedIntegerRounding::printStats(
-			    std::ofstream & fout,
-			    const bool hasCut,
-			    const OsiSolverInterface& si,
-			    const CoinPackedVector& rowAggregated,
-			    const double& rhsAggregated, const double* xlp,
-			    const double* xlpExtra,
-			    const int* listRowsAggregated,
-			    const int* listColsSelected,
-			    const int level,
-			    const double* colUpperBound,
-			    const double* colLowerBound ) const
-{
-
-
-  const int numColsAggregated = rowAggregated.getNumElements();
-  const int *rowAggregatedIndices = rowAggregated.getIndices();
-  const double *rowAggregatedElements = rowAggregated.getElements();  
-
-  fout << "Rows ";
-  for (int i = 0; i < level; ++i) {
-    fout << listRowsAggregated[i] << " ";
-  }
-  fout << std::endl;
-
-  int numColsBack = 0;
-
-  // go through all the variables 
-  for (int j = 0; j < numColsAggregated; ++j) {
-
-    // get index and coefficient of column j in the aggregated row
-    int indCol = rowAggregatedIndices[j];
-    double coefCol = rowAggregatedElements[j];
-
-    // check if a column used in aggregation is back into the aggregated row
-    for (int i = 0; i < level-1; ++i) {
-      if ( (listColsSelected[i] == indCol) && (coefCol != 0) ) {
-	numColsBack++;
-	break;
-      }
-    }
-
-
-
-    if (fabs(coefCol) < EPSILON_) {
-      // print variable number and coefficient
-      fout << indCol << " " << 0.0 << std::endl;
-      continue;
-    }
-    else {
-      // print variable number and coefficient
-      fout << indCol << " " << coefCol << " ";
-    }
-
-    // integer variables
-    if ( (indCol < numCols_)  && (!si.isContinuous(indCol)) ) {
-
-      // print 
-      fout << "I " << xlp[indCol] << " " << colLowerBound[indCol] <<
-	" " << colUpperBound[indCol] << std::endl;
-
-      continue;
-    }
-
-    // continuous variables 
-    if (indCol < numCols_) {  // variable is model variable
-
-      // print
-      fout << "C " << xlp[indCol] << " " << colLowerBound[indCol] <<
-	" " << colUpperBound[indCol] << " ";
-
-      // variable lower bound?
-      CglMixIntRoundVLB VLB = vlbs_[indCol];
-      if (VLB.getVar() != UNDEFINED_) {
-	fout << VLB.getVal() << " " << xlp[VLB.getVar()] << " " <<
-	  colLowerBound[VLB.getVar()] << " " <<
-	  colUpperBound[VLB.getVar()] << " ";
-      }
-      else {
-	fout << "-1 -1 -1 -1 ";
-      }
-
-      // variable upper bound?
-      CglMixIntRoundVUB VUB = vubs_[indCol];
-      if (VUB.getVar() != UNDEFINED_) {
-	fout << VUB.getVal() << " " << xlp[VUB.getVar()] << " " <<
-	  colLowerBound[VUB.getVar()] << " " <<
-	  colUpperBound[VUB.getVar()] << " ";
-      }
-      else {
-	fout << "-1 -1 -1 -1 ";
-      }
-
-    }	  
-    else {  // variable is slack variable
-      // in this case the LB = 0 and the UB = infinity
-      // print
-      fout << "C " << xlpExtra[indCol-numCols_] << " " << 0.0 <<
-	" " << si.getInfinity() << " ";
-    }
-
-    fout << std::endl;
-
-  }
-
-  fout << "rhs " << rhsAggregated << std::endl;
-
-  fout << "numColsBack " << numColsBack << std::endl;
-
-  if (hasCut) {
-    fout << "CUT: YES" << std::endl;
-  }
-  else {
-    fout << "CUT: NO" << std::endl;
-  }
-
-}
-// This can be used to refresh any inforamtion
-void 
-CglMixedIntegerRounding::refreshSolver(OsiSolverInterface * )
-{
-  doneInitPre_ = false;
-}
-// Create C++ lines to get to current state
-std::string
-CglMixedIntegerRounding::generateCpp( FILE * fp) 
-{
-  CglMixedIntegerRounding other;
-  fprintf(fp,"0#include \"CglMixedIntegerRounding.hpp\"\n");
-  fprintf(fp,"3  CglMixedIntegerRounding mixedIntegerRounding;\n");
-  if (MAXAGGR_!=other.MAXAGGR_)
-    fprintf(fp,"3  mixedIntegerRounding.setMAXAGGR_(%d);\n",MAXAGGR_);
-  else
-    fprintf(fp,"4  mixedIntegerRounding.setMAXAGGR_(%d);\n",MAXAGGR_);
-  if (MULTIPLY_!=other.MULTIPLY_)
-    fprintf(fp,"3  mixedIntegerRounding.setMULTIPLY_(%d);\n",MULTIPLY_);
-  else
-    fprintf(fp,"4  mixedIntegerRounding.setMULTIPLY_(%d);\n",MULTIPLY_);
-  if (CRITERION_!=other.CRITERION_)
-  fprintf(fp,"3  mixedIntegerRounding.setCRITERION_(%d);\n",CRITERION_);
-  if (doPreproc_!=other.doPreproc_)
-    fprintf(fp,"3  mixedIntegerRounding.setDoPreproc_(%d);\n", doPreproc_);
-  if (getAggressiveness()!=other.getAggressiveness())
-    fprintf(fp,"3  mixedIntegerRounding.setAggressiveness(%d);\n",getAggressiveness());
-  else
-    fprintf(fp,"4  mixedIntegerRounding.setAggressiveness(%d);\n",getAggressiveness());
-  return "mixedIntegerRounding";
-}
-void CglMixedIntegerRounding::setDoPreproc(int value)
-{
-  if (value != -1 && value != 0 && value != 1) {
-    throw CoinError("setDoPrepoc", "invalid value",
-		    "CglMixedIntegerRounding2");
-  }
-  else {
-    doPreproc_ = value;
-  }  
-}
-
-bool CglMixedIntegerRounding::getDoPreproc() const
-{
-  return (doPreproc_!=0);
-}
diff --git a/cbits/coin/CglSimpleRounding.cpp b/cbits/coin/CglSimpleRounding.cpp
deleted file mode 100644
--- a/cbits/coin/CglSimpleRounding.cpp
+++ /dev/null
@@ -1,482 +0,0 @@
-// $Id: CglSimpleRounding.cpp 1123 2013-04-06 20:47:24Z stefan $
-// Copyright (C) 2000, International Business Machines
-// Corporation and others.  All Rights Reserved.
-// This code is licensed under the terms of the Eclipse Public License (EPL).
-
-#include <cstdlib>
-#include <cmath>
-#include <cstdio>
-#include <cfloat> 
-#include <cassert>
-
-#include "CoinPragma.hpp"
-#include "CglSimpleRounding.hpp" 
-#include "CoinPackedVector.hpp"
-#include "CoinSort.hpp"
-#include "CoinPackedMatrix.hpp"
-
-//-------------------------------------------------------------
-void
-CglSimpleRounding::generateCuts(const OsiSolverInterface & si, OsiCuts & cs,
-				const CglTreeInfo /*info*/)
-{
-  int nRows=si.getNumRows(); // number of rows in the coefficient matrix
-  int nCols=si.getNumCols(); // number of columns in the coefficient matrix
-  int rowIndex;             // index into the constraint matrix stored in row
-                            // order 
-  CoinPackedVector irow;     // "integer row": working space to hold the integer
-                            // <= inequality derived from the rowIndex-th
-                            // constraint 
-  double b=0;             // working space for the rhs of integer <= inequality
-  bool * negative= new bool[nCols]; // negative[i]= true if coefficient of the 
-                                    // ith variable is negative and false
-                                    // otherwise 
-  int k;                  // dummy iterator variable 
-  for ( k=0; k<nCols; k++ ) negative[k] = false;
-  
-  const CoinPackedMatrix * rowCopy = 
-    si.getMatrixByRow(); // row copy: matrix stored in row order
-
-  /////////////////////////////////////////////////////////////////////////////
-  // Main loop:                                                              //
-  // For every row in the matrix,                                            //
-  //     if we can derive a valid <= inequality in integer variables, then   //
-  //     try to construct a simple rounding cut from the integer inequality. //
-  //     Add the resulting cut to the set of cuts.                           //
-  /////////////////////////////////////////////////////////////////////////////
-
-  for (rowIndex=0; rowIndex<nRows; rowIndex++){
-
-    // Only look at tight rows
-    // double * pi=ekk_rowduals(model); 
-    // if (fabs(pi[row]) < epsilon_){
-   //  continue;
-    // }
-
-    // Try to derive an <= inequality in integer variables from the row 
-    // by netting out the continuous variables.
-    // Store the value and the sign of the coefficients separately:
-    // irow.getElements() contains the absolute values of the coefficients.
-    // negative is a boolean vector indicating the sign of the coeffcients.
-    // b is the rhs of the <= integer inequality
-
-    if (!deriveAnIntegerRow( si, 
-                             rowIndex, 
-                             rowCopy->getVector(rowIndex),
-                             irow, b, negative))
-    {
-
-      // Reset local data for the next iteration of the rowIndex-loop
-      for(k=0; k<irow.getNumElements(); k++) negative[irow.getIndices()[k]]=false;
-      irow.setVector(0,NULL,NULL);
-      continue;
-    } 
- 
-    // Euclid's greatest common divisor (gcd) algorithm applies to positive
-    // INTEGERS. 
-    // Determine the power of 10 needed, so that multipylying the integer
-    // inequality through by 10**power makes all coefficients essentially
-    // integral. 
-    int power = power10ToMakeDoubleAnInt(irow.getNumElements(),irow.getElements(),epsilon_*1.0e-4);
-
-    // Now a vector to store the integer-ized values. For instance, 
-    // if x[i] is .66 and power is 1000 then xInt[i] will be 660
-    int * xInt = NULL;
-    if (power >=0) {
-
-      xInt = new int[irow.getNumElements()]; 
-      double dxInt; // a double version of xInt for error trapping
-      
-      
-#ifdef CGL_DEBUG      
-      printf("The (double) coefficients and their integer-ized counterparts:\n");
-#endif
-
-      for (k=0; k<irow.getNumElements(); k++){
-	dxInt = irow.getElements()[k]*pow(10.0,power);
-	xInt[k]= static_cast<int> (dxInt+0.5); // Need to add the 0.5 
-	// so that a dxInt=9.999 will give a xInt=1
-
-#ifdef CGL_DEBUG
-	printf("%g     %g   \n",irow.getElements()[k],dxInt);
-#endif
-
-      }
-
-    } else {
-
-      // If overflow is detected, one warning message is printed and 
-      // the row is skipped.
-#ifdef CGL_DEBUG
-      printf("SimpleRounding: Warning: Overflow detected \n");
-      printf("      on %i of vars in processing row %i. Row skipped.\n",
-	     -power, rowIndex);
-#endif
-      // reset local data for next iteration
-      for(k=0; k<irow.getNumElements(); k++) negative[irow.getIndices()[k]]=false;
-      irow.setVector(0,NULL,NULL);
-      continue;
-    }
-
-    // find greatest common divisor of the irow.elements
-    int gcd = gcdv(irow.getNumElements(), xInt);
-
-#ifdef CGL_DEBUG
-    printf("The gcd of xInt is %i\n",gcd);    
-#endif
-
-    // construct new cut by dividing through by gcd and 
-    // rounding down rhs and accounting for negatives
-    CoinPackedVector cut;
-    for (k=0; k<irow.getNumElements(); k++){
-        cut.insert(irow.getIndices()[k],xInt[k]/gcd);
-    }
-    double cutRhs = floor((b*pow(10.0,power))/gcd);
-
-    // un-negate the negated variables in the cut
-    {
-       const int s = cut.getNumElements();
-       const int * indices = cut.getIndices();
-       double* elements = cut.getElements();
-       for (k=0; k<s; k++){
-	 int column=indices[k];
-	  if (negative[column]) {
-	     elements[k] *= -1;
-	  }
-       }
-    }
-
-    // Create the row cut and add it to the set of cuts
-    // It may not be violated
-    if (fabs(cutRhs*gcd-b)> epsilon_){ // if the cut and row are different. 
-      OsiRowCut rc;
-      rc.setRow(cut.getNumElements(),cut.getIndices(),cut.getElements());
-      rc.setLb(-COIN_DBL_MAX);
-      rc.setUb(cutRhs);   
-      cs.insert(rc);
-
-#ifdef CGL_DEBUG
-      printf("Row %i had a simple rounding cut:\n",rowIndex);
-      printf("Cut size: %i Cut rhs: %g  Index       Element \n",
-	     cut.getNumElements(), cutRhs);
-      for (k=0; k<cut.getNumElements(); k++){
-        printf("%i      %g\n",cut.getIndices()[k], cut.getElements()[k]);
-      }
-      printf("\n");
-#endif
-    }
-
-    // Reset local data for the next iteration of the rowIndex-loop
-    for(k=0; k<irow.getNumElements(); k++) negative[irow.getIndices()[k]]=false;
-    irow.setVector(0,NULL,NULL);
-    delete [] xInt;
-
-
-  }
-
-  delete [] negative;
-}
-
-
-//-------------------------------------------------------------------
-// deriveAnIntegerRow:  dervies a <=  inequality
-//                  in integer variables of the form ax<=b 
-//                  from a row in the model, if possible by
-//                  netting out the continuous variables
-//-------------------------------------------------------------------
-bool
-CglSimpleRounding::deriveAnIntegerRow(
-       const OsiSolverInterface & si, 
-       int rowIndex,
-       const CoinShallowPackedVector & matrixRow,
-       CoinPackedVector & irow, 
-       double & b,
-       bool * negative) const
-{
-  irow.clear();
-  int i;           // dummy iterator variable
-  double sign=1.0; // +1 if le row, -1 if ge row  
-
-  // number of columns in the row
-  int sizeOfRow=matrixRow.getNumElements();
-
-  // Get the sense of the row constraint
-  const char  rowsense = si.getRowSense()[rowIndex];
-
-  // Skip equality rows  
-  if  (rowsense=='E' || rowsense=='N') {
-    return 0; 
-  }
-  // le row  
-  if (rowsense=='L'){
-    b=si.getRightHandSide()[rowIndex];
-  }
-  // ge row
-  // Multiply through by -1 to convert it to a le row 
-  if (rowsense=='G'){
-    b=-si.getRightHandSide()[rowIndex];
-    sign=-1.0;
-  }
-  
-  // Finite, but unequal row bounds  
-  // Could derive an simple rounding inequality from either 
-  // (or from both!) but for expediency, 
-  // use the le relationship as the default for now  
-  if  (rowsense=='R') {
-    b=si.getRightHandSide()[rowIndex];
-  }
-  
-   // Try to net out the continuous variables from the constraint.
-  // Multipy through by sign to convert the inequality to a le inequality  
-  // If the coefficient on a continuous variable is positive, replace
-  // the continous variable with its lower bound 
-  // If the coefficient on a continuous variable is negative, replace
-  // the continuous variable with its upper bound.
-  // example:
-  //                   2.5 <= 3x0-2.8x1+4x2,  0<=x0<=0.2, 0.4<=x1, x2 integer
-  //                         -3x0+2.8x1-4x2 <= -2.5
-  // -3(0.2)+2.8(0.4)-4x3 <= -3x0+2.8x1-4x2 <= -2.5
-  // gives the (weaker, valid) integer inequality
-  //                                   -4x2 <= -2.5+3(0.2)-2.8(0.4)
-  // sign = -1
-  // irow.elements = 4
-  // irow.indices = 2
-  // negative = (true, true, false)
-  // b=-2.5+3(0.2)-2.8(0.4)= -3.02
-
-  const double * colupper = si.getColUpper();
-  const double * collower = si.getColLower();
-
-  for (i=0; i<sizeOfRow; i++){
-    // if the variable is continuous
-    if ( !si.isInteger( matrixRow.getIndices()[i] ) ) {
-      // and the coefficient is strictly negative
-      if((sign*matrixRow.getElements()[i])<-epsilon_){
-        // and the continuous variable has a fintite upper bound
-        if (colupper[matrixRow.getIndices()[i]] < si.getInfinity()){
-          // then replace the variable with its upper bound.
-          b=b-(sign*matrixRow.getElements()[i]*colupper[matrixRow.getIndices()[i]]);
-        } 
-        else 
-          return 0;
-      }
-      // if the coefficient in strictly positive
-      else if((sign*matrixRow.getElements()[i])>epsilon_){
-        // and the continuous variable has a finite lower bound
-        if (collower[matrixRow.getIndices()[i]] > -si.getInfinity()){
-          // then replace the variable with its lower bound.
-          b=b-(sign*matrixRow.getElements()[i]*collower[matrixRow.getIndices()[i]]);
-        }
-        else
-          return 0;
-      }
-      // else the coefficient is essentially an explicitly stored zero; do
-      // nothing   
-    }
-    // else: the variable is integer
-    else{
-      // if the integer variable is fixed, net it out of the integer inequality
-      if (colupper[matrixRow.getIndices()[i]]- collower[matrixRow.getIndices()[i]]<
-	  epsilon_){
-          b=b-(sign*matrixRow.getElements()[i]*colupper[matrixRow.getIndices()[i]]);
-      }
-      // else the variable is a free integer variable and it becomes
-      // part of the integer inequality
-      else {
-        irow.insert(matrixRow.getIndices()[i],sign*matrixRow.getElements()[i]);
-      }
-    }
-  }
-  
-  // if there are no free integer variables, then abandon this row;
-  if(irow.getNumElements() == 0){
-    return 0;
-  }
-  
-  // Store the values and the signs of the coefficients separately.
-  // irow.elements stores the absolute values of the coefficients
-  // negative indicates the sign.
-  // Note: after this point b is essentially the effecitve rhs of a le
-  // contraint
-  {
-     const int s = irow.getNumElements();
-     const int * indices = irow.getIndices();
-     double * elements = irow.getElements();
-     for(i=0; i<s; i++){
-	if (elements[i] < -epsilon_) {
-	   negative[indices[i]]= true; // store indicator of the sign 
-	   elements[i] *= -1;          // store only positive values
-	}
-    }
-  }
-
-  return 1;
-}
-
-
-//-------------------------------------------------------------------
-// power10ToMakeDoubleAnInt: 
-//   given a vector of positive doubles x_i, i=1, size, and a positive
-//   tolerance dataTol, determine the smallest power of 10 needed so that
-//   x[i]*10**power is integer for all i.
-
-//   dataTol_ should be correlated to the accuracy of the data,
-//   and choosen to be the largest value that's tolerable.
-//   
-//   (Easily extended to take an input vector of arbitrary sign)
-//-------------------------------------------------------------------
-//
-int
-CglSimpleRounding::power10ToMakeDoubleAnInt( 
-    int size,             // the length of the input vector x
-    const double * x,     // the input vector of postive values  
-    double dataTol) const // the (strictly postive) precision of the data
-
-{
-  // Assumption: data precision is positive
-  assert( dataTol > 0 );
-
-
-  int i;           // loop iterator 
-  int maxPower=0;  // maximum power of 10 used to convert any x[i] to an
-                   // integer 
-                   // this is the number we are after.
-  int power = 0;   // power of 10 used to convert a particular x[i] to an
-                   // integer 
-
-#ifdef OLD_MULT
-  double intPart;  // the integer part of the number
-#endif
-  double fracPart; // the fractional part of the number
-                   // we keep multiplying by 10 until the fractional part is 0
-                   // (well, really just until the factional part is less than
-                   // dataTol) 
-
-  // JJF - code seems to fail sometimes as multiplying by 10 - so
-  // definition of dataTol changed - see header file
-
-  const double multiplier[16]={1.0,1.0e1,1.0e2,1.0e3,1.0e4,1.0e5,
-			       1.0e6,1.0e7,1.0e8,1.0e9,1.0e10,1.0e11,
-			       1.0e12,1.0e13,1.0e14,1.0e15};
-
-  // Loop through every element in the array in x
-  for (i=0; i<size; i++){
-    power = 0;
-
-#ifdef OLD_MULT 
-    // look at the fractional part of x[i]
-    // FYI: if you want to modify this member function to take an input
-    // vector x of arbitary sign, change this line below to 
-    // fracPart = modf(fabs(x[i]),&intPart);
-    fracPart = modf(x[i],&intPart);
-
-    // if the fractional part is close enough to 0 or 1, we're done with this
-    // value
-    while(!(fracPart < dataTol || 1-fracPart < dataTol )) {
-       // otherwise, multiply by 10 and look at the fractional part of the
-       // result. 
-       ++power;
-       fracPart = fracPart*10.0;
-       fracPart = modf(fracPart,&intPart);     
-    }
-#else
-    // use fabs as safer and does no harm
-    double value = fabs(x[i]);
-    double scaledValue;
-    // Do loop - always using original value to stop round off error.
-    // If we don't find in 15 goes give up
-    for (power=0;power<16;power++) {
-      double tolerance = dataTol*multiplier[power];
-      scaledValue = value*multiplier[power];
-      fracPart = scaledValue-floor(scaledValue);
-      if(fracPart < tolerance || 1.0-fracPart < tolerance ) {
-	break;
-      }
-    }
-    if (power==16||scaledValue>2147483647) {
-#ifdef CGL_DEBUG
-      printf("Overflow %g => %g, power %d\n",x[i],scaledValue,power);
-#endif
-      return -1;
-    }
-#endif    
-#ifdef CGL_DEBUG
-    printf("The smallest power of 10 to make %g  integral = %i\n",x[i],power);
-#endif
-
-    
-    // keep track of the largest power needed so that at the end of the for
-    // loop
-    // x[i]*10**maxPower will be integral for all i
-    if (maxPower < power) maxPower=power;
-  }
-
-  return maxPower;
-}
-
-//-------------------------------------------------------------------
-// Default Constructor 
-//-------------------------------------------------------------------
-CglSimpleRounding::CglSimpleRounding ()
-:
-CglCutGenerator(),
-epsilon_(1.0e-08)
-{
-  // nothing to do here
-}
-//-------------------------------------------------------------------
-// Copy constructor 
-//-------------------------------------------------------------------
-CglSimpleRounding::CglSimpleRounding (
-                  const CglSimpleRounding & source)
-:
-CglCutGenerator(source),
-epsilon_(source.epsilon_)
-{  
-  // Nothing to do here
-}
-
-
-//-------------------------------------------------------------------
-// Clone
-//-------------------------------------------------------------------
-CglCutGenerator *
-CglSimpleRounding::clone() const
-{
-  return new CglSimpleRounding(*this);
-}
-
-//-------------------------------------------------------------------
-// Destructor 
-//-------------------------------------------------------------------
-CglSimpleRounding::~CglSimpleRounding ()
-{
-  // Nothing to do here
-}
-
-//----------------------------------------------------------------
-// Assignment operator 
-//-------------------------------------------------------------------
-CglSimpleRounding &
-CglSimpleRounding::operator=(
-                   const CglSimpleRounding& rhs)
-{
-  if (this != &rhs) {
-    CglCutGenerator::operator=(rhs);
-    epsilon_=rhs.epsilon_;
-  }
-  return *this;
-}
-// Create C++ lines to get to current state
-std::string
-CglSimpleRounding::generateCpp( FILE * fp) 
-{
-  CglSimpleRounding other;
-  fprintf(fp,"0#include \"CglSimpleRounding.hpp\"\n");
-  fprintf(fp,"3  CglSimpleRounding simpleRounding;\n");
-  if (getAggressiveness()!=other.getAggressiveness())
-    fprintf(fp,"3  simpleRounding.setAggressiveness(%d);\n",getAggressiveness());
-  else
-    fprintf(fp,"4  simpleRounding.setAggressiveness(%d);\n",getAggressiveness());
-  return "simpleRounding";
-}
diff --git a/cbits/coin/ClpDummyMatrix.cpp b/cbits/coin/ClpDummyMatrix.cpp
deleted file mode 100644
--- a/cbits/coin/ClpDummyMatrix.cpp
+++ /dev/null
@@ -1,263 +0,0 @@
-/* $Id: ClpDummyMatrix.cpp 1665 2011-01-04 17:55:54Z lou $ */
-// Copyright (C) 2003, International Business Machines
-// Corporation and others.  All Rights Reserved.
-// This code is licensed under the terms of the Eclipse Public License (EPL).
-
-#include <cstdio>
-
-#include "CoinPragma.hpp"
-
-#include "ClpSimplex.hpp"
-#include "ClpDummyMatrix.hpp"
-#include "ClpFactorization.hpp"
-#include "ClpMessage.hpp"
-
-//#############################################################################
-// Constructors / Destructor / Assignment
-//#############################################################################
-
-//-------------------------------------------------------------------
-// Default Constructor
-//-------------------------------------------------------------------
-ClpDummyMatrix::ClpDummyMatrix ()
-     : ClpMatrixBase()
-{
-     setType(14);
-     numberRows_ = 0;
-     numberColumns_ = 0;
-     numberElements_ = 0;
-}
-
-/* Constructor from data */
-ClpDummyMatrix::ClpDummyMatrix(int numberColumns, int numberRows,
-                               int numberElements)
-     : ClpMatrixBase()
-{
-     setType(14);
-     numberRows_ = numberRows;
-     numberColumns_ = numberColumns;
-     numberElements_ = numberElements;
-}
-//-------------------------------------------------------------------
-// Copy constructor
-//-------------------------------------------------------------------
-ClpDummyMatrix::ClpDummyMatrix (const ClpDummyMatrix & rhs)
-     : ClpMatrixBase(rhs)
-{
-     numberRows_ = rhs.numberRows_;
-     numberColumns_ = rhs.numberColumns_;
-     numberElements_ = rhs.numberElements_;
-}
-
-ClpDummyMatrix::ClpDummyMatrix (const CoinPackedMatrix & )
-     : ClpMatrixBase()
-{
-     std::cerr << "Constructor from CoinPackedMatrix nnot supported - ClpDummyMatrix" << std::endl;
-     abort();
-}
-
-//-------------------------------------------------------------------
-// Destructor
-//-------------------------------------------------------------------
-ClpDummyMatrix::~ClpDummyMatrix ()
-{
-}
-
-//----------------------------------------------------------------
-// Assignment operator
-//-------------------------------------------------------------------
-ClpDummyMatrix &
-ClpDummyMatrix::operator=(const ClpDummyMatrix& rhs)
-{
-     if (this != &rhs) {
-          ClpMatrixBase::operator=(rhs);
-          numberRows_ = rhs.numberRows_;
-          numberColumns_ = rhs.numberColumns_;
-          numberElements_ = rhs.numberElements_;
-     }
-     return *this;
-}
-//-------------------------------------------------------------------
-// Clone
-//-------------------------------------------------------------------
-ClpMatrixBase * ClpDummyMatrix::clone() const
-{
-     return new ClpDummyMatrix(*this);
-}
-
-/* Returns a new matrix in reverse order without gaps */
-ClpMatrixBase *
-ClpDummyMatrix::reverseOrderedCopy() const
-{
-     std::cerr << "reverseOrderedCopy not supported - ClpDummyMatrix" << std::endl;
-     abort();
-     return NULL;
-}
-//unscaled versions
-void
-ClpDummyMatrix::times(double ,
-                      const double * , double * ) const
-{
-     std::cerr << "times not supported - ClpDummyMatrix" << std::endl;
-     abort();
-}
-void
-ClpDummyMatrix::transposeTimes(double ,
-                               const double * , double * ) const
-{
-     std::cerr << "transposeTimes not supported - ClpDummyMatrix" << std::endl;
-     abort();
-}
-void
-ClpDummyMatrix::times(double ,
-                      const double * , double * ,
-                      const double * ,
-                      const double * ) const
-{
-     std::cerr << "timesnot supported - ClpDummyMatrix" << std::endl;
-     abort();
-}
-void
-ClpDummyMatrix::transposeTimes( double,
-                                const double * , double * ,
-                                const double * ,
-                                const double * ) const
-{
-     std::cerr << "transposeTimesnot supported - ClpDummyMatrix" << std::endl;
-     abort();
-}
-/* Return <code>x * A + y</code> in <code>z</code>.
-	Squashes small elements and knows about ClpSimplex */
-void
-ClpDummyMatrix::transposeTimes(const ClpSimplex * , double ,
-                               const CoinIndexedVector * ,
-                               CoinIndexedVector * ,
-                               CoinIndexedVector * ) const
-{
-     std::cerr << "transposeTimes not supported - ClpDummyMatrix" << std::endl;
-     abort();
-}
-/* Return <code>x *A in <code>z</code> but
-   just for indices in y */
-void
-ClpDummyMatrix::subsetTransposeTimes(const ClpSimplex * ,
-                                     const CoinIndexedVector * ,
-                                     const CoinIndexedVector * ,
-                                     CoinIndexedVector * ) const
-{
-     std::cerr << "subsetTransposeTimes not supported - ClpDummyMatrix" << std::endl;
-     abort();
-}
-/// returns number of elements in column part of basis,
-CoinBigIndex
-ClpDummyMatrix::countBasis(const int * ,
-                           int & )
-{
-     std::cerr << "countBasis not supported - ClpDummyMatrix" << std::endl;
-     abort();
-     return 0;
-}
-void
-ClpDummyMatrix::fillBasis(ClpSimplex * ,
-                          const int * ,
-                          int & ,
-                          int * , int * ,
-                          int * , int * ,
-                          CoinFactorizationDouble * )
-{
-     std::cerr << "fillBasis not supported - ClpDummyMatrix" << std::endl;
-     abort();
-}
-/* Unpacks a column into an CoinIndexedvector
- */
-void
-ClpDummyMatrix::unpack(const ClpSimplex * , CoinIndexedVector * ,
-                       int ) const
-{
-     std::cerr << "unpack not supported - ClpDummyMatrix" << std::endl;
-     abort();
-}
-/* Unpacks a column into an CoinIndexedvector
-** in packed foramt
-Note that model is NOT const.  Bounds and objective could
-be modified if doing column generation (just for this variable) */
-void
-ClpDummyMatrix::unpackPacked(ClpSimplex * ,
-                             CoinIndexedVector * ,
-                             int ) const
-{
-     std::cerr << "unpackPacked not supported - ClpDummyMatrix" << std::endl;
-     abort();
-}
-/* Adds multiple of a column into an CoinIndexedvector
-      You can use quickAdd to add to vector */
-void
-ClpDummyMatrix::add(const ClpSimplex * , CoinIndexedVector * ,
-                    int , double ) const
-{
-     std::cerr << "add not supported - ClpDummyMatrix" << std::endl;
-     abort();
-}
-/* Adds multiple of a column into an array */
-void
-ClpDummyMatrix::add(const ClpSimplex * , double * ,
-                    int , double ) const
-{
-     std::cerr << "add not supported - ClpDummyMatrix" << std::endl;
-     abort();
-}
-
-// Return a complete CoinPackedMatrix
-CoinPackedMatrix *
-ClpDummyMatrix::getPackedMatrix() const
-{
-     std::cerr << "getPackedMatrix not supported - ClpDummyMatrix" << std::endl;
-     abort();
-     return NULL;
-}
-/* A vector containing the elements in the packed matrix. Note that there
-   might be gaps in this list, entries that do not belong to any
-   major-dimension vector. To get the actual elements one should look at
-   this vector together with vectorStarts and vectorLengths. */
-const double *
-ClpDummyMatrix::getElements() const
-{
-     std::cerr << "getElements not supported - ClpDummyMatrix" << std::endl;
-     abort();
-     return NULL;
-}
-
-const CoinBigIndex *
-ClpDummyMatrix::getVectorStarts() const
-{
-     std::cerr << "getVectorStarts not supported - ClpDummyMatrix" << std::endl;
-     abort();
-     return NULL;
-}
-/* The lengths of the major-dimension vectors. */
-const int *
-ClpDummyMatrix::getVectorLengths() const
-{
-     std::cerr << "get VectorLengths not supported - ClpDummyMatrix" << std::endl;
-     abort();
-     return NULL;
-}
-/* Delete the columns whose indices are listed in <code>indDel</code>. */
-void ClpDummyMatrix::deleteCols(const int , const int * )
-{
-     std::cerr << "deleteCols not supported - ClpDummyMatrix" << std::endl;
-     abort();
-}
-/* Delete the rows whose indices are listed in <code>indDel</code>. */
-void ClpDummyMatrix::deleteRows(const int , const int * )
-{
-     std::cerr << "deleteRows not supported - ClpDummyMatrix" << std::endl;
-     abort();
-}
-const int *
-ClpDummyMatrix::getIndices() const
-{
-     std::cerr << "getIndices not supported - ClpDummyMatrix" << std::endl;
-     abort();
-     return NULL;
-}
diff --git a/cbits/coin/ClpDynamicExampleMatrix.cpp b/cbits/coin/ClpDynamicExampleMatrix.cpp
deleted file mode 100644
--- a/cbits/coin/ClpDynamicExampleMatrix.cpp
+++ /dev/null
@@ -1,683 +0,0 @@
-/* $Id: ClpDynamicExampleMatrix.cpp 1941 2013-04-10 16:52:27Z stefan $ */
-// Copyright (C) 2004, International Business Machines
-// Corporation and others.  All Rights Reserved.
-// This code is licensed under the terms of the Eclipse Public License (EPL).
-
-#include <cstdio>
-
-#include "CoinPragma.hpp"
-#include "CoinIndexedVector.hpp"
-#include "CoinHelperFunctions.hpp"
-
-#include "ClpSimplex.hpp"
-#include "ClpFactorization.hpp"
-#include "ClpQuadraticObjective.hpp"
-#include "ClpNonLinearCost.hpp"
-// at end to get min/max!
-#include "ClpDynamicExampleMatrix.hpp"
-#include "ClpMessage.hpp"
-//#define CLP_DEBUG
-//#define CLP_DEBUG_PRINT
-//#############################################################################
-// Constructors / Destructor / Assignment
-//#############################################################################
-
-//-------------------------------------------------------------------
-// Default Constructor
-//-------------------------------------------------------------------
-ClpDynamicExampleMatrix::ClpDynamicExampleMatrix ()
-     : ClpDynamicMatrix(),
-       numberColumns_(0),
-       startColumnGen_(NULL),
-       rowGen_(NULL),
-       elementGen_(NULL),
-       costGen_(NULL),
-       fullStartGen_(NULL),
-       dynamicStatusGen_(NULL),
-       idGen_(NULL),
-       columnLowerGen_(NULL),
-       columnUpperGen_(NULL)
-{
-     setType(25);
-}
-
-//-------------------------------------------------------------------
-// Copy constructor
-//-------------------------------------------------------------------
-ClpDynamicExampleMatrix::ClpDynamicExampleMatrix (const ClpDynamicExampleMatrix & rhs)
-     : ClpDynamicMatrix(rhs)
-{
-     numberColumns_ = rhs.numberColumns_;
-     startColumnGen_ = ClpCopyOfArray(rhs.startColumnGen_, numberColumns_ + 1);
-     CoinBigIndex numberElements = startColumnGen_[numberColumns_];
-     rowGen_ = ClpCopyOfArray(rhs.rowGen_, numberElements);;
-     elementGen_ = ClpCopyOfArray(rhs.elementGen_, numberElements);;
-     costGen_ = ClpCopyOfArray(rhs.costGen_, numberColumns_);
-     fullStartGen_ = ClpCopyOfArray(rhs.fullStartGen_, numberSets_ + 1);
-     dynamicStatusGen_ = ClpCopyOfArray(rhs.dynamicStatusGen_, numberColumns_);
-     idGen_ = ClpCopyOfArray(rhs.idGen_, maximumGubColumns_);
-     columnLowerGen_ = ClpCopyOfArray(rhs.columnLowerGen_, numberColumns_);
-     columnUpperGen_ = ClpCopyOfArray(rhs.columnUpperGen_, numberColumns_);
-}
-
-/* This is the real constructor*/
-ClpDynamicExampleMatrix::ClpDynamicExampleMatrix(ClpSimplex * model, int numberSets,
-          int numberGubColumns, const int * starts,
-          const double * lower, const double * upper,
-          const CoinBigIndex * startColumn, const int * row,
-          const double * element, const double * cost,
-          const double * columnLower, const double * columnUpper,
-          const unsigned char * status,
-          const unsigned char * dynamicStatus,
-          int numberIds, const int *ids)
-     : ClpDynamicMatrix(model, numberSets, 0, NULL, lower, upper, NULL, NULL, NULL, NULL, NULL, NULL,
-                        NULL, NULL)
-{
-     setType(25);
-     numberColumns_ = numberGubColumns;
-     // start with safe values - then experiment
-     maximumGubColumns_ = numberColumns_;
-     maximumElements_ = startColumn[numberColumns_];
-     // delete odd stuff created by ClpDynamicMatrix constructor
-     delete [] startSet_;
-     startSet_ = new int [numberSets_];
-     delete [] next_;
-     next_ = new int [maximumGubColumns_];
-     delete [] row_;
-     delete [] element_;
-     delete [] startColumn_;
-     delete [] cost_;
-     delete [] columnLower_;
-     delete [] columnUpper_;
-     delete [] dynamicStatus_;
-     delete [] status_;
-     delete [] id_;
-     // and size correctly
-     row_ = new int [maximumElements_];
-     element_ = new double [maximumElements_];
-     startColumn_ = new CoinBigIndex [maximumGubColumns_+1];
-     // say no columns yet
-     numberGubColumns_ = 0;
-     startColumn_[0] = 0;
-     cost_ = new double[maximumGubColumns_];
-     dynamicStatus_ = new unsigned char [2*maximumGubColumns_];
-     memset(dynamicStatus_, 0, maximumGubColumns_);
-     id_ = new int[maximumGubColumns_];
-     if (columnLower)
-          columnLower_ = new double[maximumGubColumns_];
-     else
-          columnLower_ = NULL;
-     if (columnUpper)
-          columnUpper_ = new double[maximumGubColumns_];
-     else
-          columnUpper_ = NULL;
-     // space for ids
-     idGen_ = new int [maximumGubColumns_];
-     int iSet;
-     for (iSet = 0; iSet < numberSets_; iSet++)
-          startSet_[iSet] = -1;
-     // This starts code specific to this storage method
-     CoinBigIndex i;
-     fullStartGen_ = ClpCopyOfArray(starts, numberSets_ + 1);
-     startColumnGen_ = ClpCopyOfArray(startColumn, numberColumns_ + 1);
-     CoinBigIndex numberElements = startColumnGen_[numberColumns_];
-     rowGen_ = ClpCopyOfArray(row, numberElements);
-     elementGen_ = new double[numberElements];
-     for (i = 0; i < numberElements; i++)
-          elementGen_[i] = element[i];
-     costGen_ = new double[numberColumns_];
-     for (i = 0; i < numberColumns_; i++) {
-          costGen_[i] = cost[i];
-          // I don't think I need sorted but ...
-          CoinSort_2(rowGen_ + startColumnGen_[i], rowGen_ + startColumnGen_[i+1], elementGen_ + startColumnGen_[i]);
-     }
-     if (columnLower) {
-          columnLowerGen_ = new double[numberColumns_];
-          for (i = 0; i < numberColumns_; i++) {
-               columnLowerGen_[i] = columnLower[i];
-               if (columnLowerGen_[i]) {
-                    printf("Non-zero lower bounds not allowed - subtract from model\n");
-                    abort();
-               }
-          }
-     } else {
-          columnLowerGen_ = NULL;
-     }
-     if (columnUpper) {
-          columnUpperGen_ = new double[numberColumns_];
-          for (i = 0; i < numberColumns_; i++)
-               columnUpperGen_[i] = columnUpper[i];
-     } else {
-          columnUpperGen_ = NULL;
-     }
-     // end specific coding
-     if (columnUpper_) {
-          // set all upper bounds so we have enough space
-          double * columnUpper = model->columnUpper();
-          for(i = firstDynamic_; i < lastDynamic_; i++)
-               columnUpper[i] = 1.0e10;
-     }
-     status_ = new unsigned char [2*numberSets_+4];
-     if (status) {
-          memcpy(status_,status, numberSets_ * sizeof(char));
-          assert (dynamicStatus);
-          CoinMemcpyN(dynamicStatus, numberIds, dynamicStatus_);
-          assert (numberIds);
-     } else {
-          assert (!numberIds);
-          memset(status_, 0, numberSets_);
-          for (i = 0; i < numberSets_; i++) {
-               // make slack key
-               setStatus(i, ClpSimplex::basic);
-          }
-     }
-     dynamicStatusGen_ = new unsigned char [numberColumns_];
-     memset(dynamicStatusGen_, 0, numberColumns_); // for clarity
-     for (i = 0; i < numberColumns_; i++)
-          setDynamicStatusGen(i, atLowerBound);
-     // Populate with enough columns
-     if (!numberIds) {
-          // This could be made more sophisticated
-          for (iSet = 0; iSet < numberSets_; iSet++) {
-               int sequence = fullStartGen_[iSet];
-               CoinBigIndex start = startColumnGen_[sequence];
-               addColumn(startColumnGen_[sequence+1] - start,
-                         rowGen_ + start,
-                         elementGen_ + start,
-                         costGen_[sequence],
-                         columnLowerGen_ ? columnLowerGen_[sequence] : 0,
-                         columnUpperGen_ ? columnUpperGen_[sequence] : 1.0e30,
-                         iSet, getDynamicStatusGen(sequence));
-               idGen_[iSet] = sequence; // say which one in
-               setDynamicStatusGen(sequence, inSmall);
-          }
-     } else {
-          // put back old ones
-          int * set = new int[numberColumns_];
-          for (iSet = 0; iSet < numberSets_; iSet++) {
-               for (CoinBigIndex j = fullStartGen_[iSet]; j < fullStartGen_[iSet+1]; j++)
-                    set[j] = iSet;
-          }
-          for (int i = 0; i < numberIds; i++) {
-               int sequence = ids[i];
-               CoinBigIndex start = startColumnGen_[sequence];
-               addColumn(startColumnGen_[sequence+1] - start,
-                         rowGen_ + start,
-                         elementGen_ + start,
-                         costGen_[sequence],
-                         columnLowerGen_ ? columnLowerGen_[sequence] : 0,
-                         columnUpperGen_ ? columnUpperGen_[sequence] : 1.0e30,
-                         set[sequence], getDynamicStatus(i));
-               idGen_[iSet] = sequence; // say which one in
-               setDynamicStatusGen(sequence, inSmall);
-          }
-          delete [] set;
-     }
-     if (!status) {
-          gubCrash();
-     } else {
-          initialProblem();
-     }
-}
-#if 0
-// This constructor just takes over ownership
-ClpDynamicExampleMatrix::ClpDynamicExampleMatrix(ClpSimplex * model, int numberSets,
-          int numberGubColumns, int * starts,
-          const double * lower, const double * upper,
-          int * startColumn, int * row,
-          double * element, double * cost,
-          double * columnLower, double * columnUpper,
-          const unsigned char * status,
-          const unsigned char * dynamicStatus,
-          int numberIds, const int *ids)
-     : ClpDynamicMatrix(model, numberSets, 0, NULL, lower, upper, NULL, NULL, NULL, NULL, NULL, NULL,
-                        NULL, NULL)
-{
-     setType(25);
-     numberColumns_ = numberGubColumns;
-     // start with safe values - then experiment
-     maximumGubColumns_ = numberColumns_;
-     maximumElements_ = startColumn[numberColumns_];
-     // delete odd stuff created by ClpDynamicMatrix constructor
-     delete [] startSet_;
-     startSet_ = new int [numberSets_];
-     delete [] next_;
-     next_ = new int [maximumGubColumns_];
-     delete [] row_;
-     delete [] element_;
-     delete [] startColumn_;
-     delete [] cost_;
-     delete [] columnLower_;
-     delete [] columnUpper_;
-     delete [] dynamicStatus_;
-     delete [] status_;
-     delete [] id_;
-     // and size correctly
-     row_ = new int [maximumElements_];
-     element_ = new double [maximumElements_];
-     startColumn_ = new CoinBigIndex [maximumGubColumns_+1];
-     // say no columns yet
-     numberGubColumns_ = 0;
-     startColumn_[0] = 0;
-     cost_ = new double[maximumGubColumns_];
-     dynamicStatus_ = new unsigned char [2*maximumGubColumns_];
-     memset(dynamicStatus_, 0, maximumGubColumns_);
-     id_ = new int[maximumGubColumns_];
-     if (columnLower)
-          columnLower_ = new double[maximumGubColumns_];
-     else
-          columnLower_ = NULL;
-     if (columnUpper)
-          columnUpper_ = new double[maximumGubColumns_];
-     else
-          columnUpper_ = NULL;
-     // space for ids
-     idGen_ = new int [maximumGubColumns_];
-     int iSet;
-     for (iSet = 0; iSet < numberSets_; iSet++)
-          startSet_[iSet] = -1;
-     // This starts code specific to this storage method
-     CoinBigIndex i;
-     fullStartGen_ = starts;
-     startColumnGen_ = startColumn;
-     rowGen_ = row;
-     elementGen_ = element;
-     costGen_ = cost;
-     for (i = 0; i < numberColumns_; i++) {
-          // I don't think I need sorted but ...
-          CoinSort_2(rowGen_ + startColumnGen_[i], rowGen_ + startColumnGen_[i+1], elementGen_ + startColumnGen_[i]);
-     }
-     if (columnLower) {
-          columnLowerGen_ = columnLower;
-          for (i = 0; i < numberColumns_; i++) {
-               if (columnLowerGen_[i]) {
-                    printf("Non-zero lower bounds not allowed - subtract from model\n");
-                    abort();
-               }
-          }
-     } else {
-          columnLowerGen_ = NULL;
-     }
-     if (columnUpper) {
-          columnUpperGen_ = columnUpper;
-     } else {
-          columnUpperGen_ = NULL;
-     }
-     // end specific coding
-     if (columnUpper_) {
-          // set all upper bounds so we have enough space
-          double * columnUpper = model->columnUpper();
-          for(i = firstDynamic_; i < lastDynamic_; i++)
-               columnUpper[i] = 1.0e10;
-     }
-     status_ = new unsigned char [2*numberSets_+4];
-     if (status) {
-          memcpy(status_,status, numberSets_ * sizeof(char));
-          assert (dynamicStatus);
-          CoinMemcpyN(dynamicStatus, numberIds, dynamicStatus_);
-          assert (numberIds);
-     } else {
-          assert (!numberIds);
-          memset(status_, 0, numberSets_);
-          for (i = 0; i < numberSets_; i++) {
-               // make slack key
-               setStatus(i, ClpSimplex::basic);
-          }
-     }
-     dynamicStatusGen_ = new unsigned char [numberColumns_];
-     memset(dynamicStatusGen_, 0, numberColumns_); // for clarity
-     for (i = 0; i < numberColumns_; i++)
-          setDynamicStatusGen(i, atLowerBound);
-     // Populate with enough columns
-     if (!numberIds) {
-          // This could be made more sophisticated
-          for (iSet = 0; iSet < numberSets_; iSet++) {
-               int sequence = fullStartGen_[iSet];
-               CoinBigIndex start = startColumnGen_[sequence];
-               addColumn(startColumnGen_[sequence+1] - start,
-                         rowGen_ + start,
-                         elementGen_ + start,
-                         costGen_[sequence],
-                         columnLowerGen_ ? columnLowerGen_[sequence] : 0,
-                         columnUpperGen_ ? columnUpperGen_[sequence] : 1.0e30,
-                         iSet, getDynamicStatusGen(sequence));
-               idGen_[iSet] = sequence; // say which one in
-               setDynamicStatusGen(sequence, inSmall);
-          }
-     } else {
-          // put back old ones
-          int * set = new int[numberColumns_];
-          for (iSet = 0; iSet < numberSets_; iSet++) {
-               for (CoinBigIndex j = fullStartGen_[iSet]; j < fullStartGen_[iSet+1]; j++)
-                    set[j] = iSet;
-          }
-          for (int i = 0; i < numberIds; i++) {
-               int sequence = ids[i];
-               int iSet = set[sequence];
-               CoinBigIndex start = startColumnGen_[sequence];
-               addColumn(startColumnGen_[sequence+1] - start,
-                         rowGen_ + start,
-                         elementGen_ + start,
-                         costGen_[sequence],
-                         columnLowerGen_ ? columnLowerGen_[sequence] : 0,
-                         columnUpperGen_ ? columnUpperGen_[sequence] : 1.0e30,
-                         iSet, getDynamicStatus(i));
-               idGen_[i] = sequence; // say which one in
-               setDynamicStatusGen(sequence, inSmall);
-          }
-          delete [] set;
-     }
-     if (!status) {
-          gubCrash();
-     } else {
-          initialProblem();
-     }
-}
-#endif
-//-------------------------------------------------------------------
-// Destructor
-//-------------------------------------------------------------------
-ClpDynamicExampleMatrix::~ClpDynamicExampleMatrix ()
-{
-     delete [] startColumnGen_;
-     delete [] rowGen_;
-     delete [] elementGen_;
-     delete [] costGen_;
-     delete [] fullStartGen_;
-     delete [] dynamicStatusGen_;
-     delete [] idGen_;
-     delete [] columnLowerGen_;
-     delete [] columnUpperGen_;
-}
-
-//----------------------------------------------------------------
-// Assignment operator
-//-------------------------------------------------------------------
-ClpDynamicExampleMatrix &
-ClpDynamicExampleMatrix::operator=(const ClpDynamicExampleMatrix& rhs)
-{
-     if (this != &rhs) {
-          ClpDynamicMatrix::operator=(rhs);
-          numberColumns_ = rhs.numberColumns_;
-          delete [] startColumnGen_;
-          delete [] rowGen_;
-          delete [] elementGen_;
-          delete [] costGen_;
-          delete [] fullStartGen_;
-          delete [] dynamicStatusGen_;
-          delete [] idGen_;
-          delete [] columnLowerGen_;
-          delete [] columnUpperGen_;
-          startColumnGen_ = ClpCopyOfArray(rhs.startColumnGen_, numberColumns_ + 1);
-          CoinBigIndex numberElements = startColumnGen_[numberColumns_];
-          rowGen_ = ClpCopyOfArray(rhs.rowGen_, numberElements);;
-          elementGen_ = ClpCopyOfArray(rhs.elementGen_, numberElements);;
-          costGen_ = ClpCopyOfArray(rhs.costGen_, numberColumns_);
-          fullStartGen_ = ClpCopyOfArray(rhs.fullStartGen_, numberSets_ + 1);
-          dynamicStatusGen_ = ClpCopyOfArray(rhs.dynamicStatusGen_, numberColumns_);
-          idGen_ = ClpCopyOfArray(rhs.idGen_, maximumGubColumns_);
-          columnLowerGen_ = ClpCopyOfArray(rhs.columnLowerGen_, numberColumns_);
-          columnUpperGen_ = ClpCopyOfArray(rhs.columnUpperGen_, numberColumns_);
-     }
-     return *this;
-}
-//-------------------------------------------------------------------
-// Clone
-//-------------------------------------------------------------------
-ClpMatrixBase * ClpDynamicExampleMatrix::clone() const
-{
-     return new ClpDynamicExampleMatrix(*this);
-}
-// Partial pricing
-void
-ClpDynamicExampleMatrix::partialPricing(ClpSimplex * model, double startFraction, double endFraction,
-                                        int & bestSequence, int & numberWanted)
-{
-     numberWanted = currentWanted_;
-     assert(!model->rowScale());
-     if (!numberSets_) {
-          // no gub
-          ClpPackedMatrix::partialPricing(model, startFraction, endFraction, bestSequence, numberWanted);
-     } else {
-          // and do some proportion of full set
-          int startG2 = static_cast<int> (startFraction * numberSets_);
-          int endG2 = static_cast<int> (endFraction * numberSets_ + 0.1);
-          endG2 = CoinMin(endG2, numberSets_);
-          //printf("gub price - set start %d end %d\n",
-          //   startG2,endG2);
-          double tolerance = model->currentDualTolerance();
-          double * reducedCost = model->djRegion();
-          const double * duals = model->dualRowSolution();
-          double bestDj;
-          int numberRows = model->numberRows();
-          int slackOffset = lastDynamic_ + numberRows;
-          int structuralOffset = slackOffset + numberSets_;
-          int structuralOffset2 = structuralOffset + maximumGubColumns_;
-          // If nothing found yet can go all the way to end
-          int endAll = endG2;
-          if (bestSequence < 0 && !startG2)
-               endAll = numberSets_;
-          if (bestSequence >= 0) {
-               if (bestSequence != savedBestSequence_)
-                    bestDj = fabs(reducedCost[bestSequence]); // dj from slacks or permanent
-               else
-                    bestDj = savedBestDj_;
-          } else {
-               bestDj = tolerance;
-          }
-          int saveSequence = bestSequence;
-          double djMod = 0.0;
-          double bestDjMod = 0.0;
-          //printf("iteration %d start %d end %d - wanted %d\n",model->numberIterations(),
-          //     startG2,endG2,numberWanted);
-          int bestSet = -1;
-          int minSet = minimumObjectsScan_ < 0 ? 5 : minimumObjectsScan_;
-          int minNeg = minimumGoodReducedCosts_ < 0 ? 5 : minimumGoodReducedCosts_;
-          for (int iSet = startG2; iSet < endAll; iSet++) {
-               if (numberWanted + minNeg < originalWanted_ && iSet > startG2 + minSet) {
-                    // give up
-                    numberWanted = 0;
-                    break;
-               } else if (iSet == endG2 && bestSequence >= 0) {
-                    break;
-               }
-               int gubRow = toIndex_[iSet];
-               if (gubRow >= 0) {
-                    djMod = duals[gubRow+numberStaticRows_]; // have I got sign right?
-               } else {
-                    int iBasic = keyVariable_[iSet];
-                    if (iBasic >= numberColumns_) {
-                         djMod = 0.0; // set not in
-                    } else {
-                         // get dj without
-                         djMod = 0.0;
-                         for (CoinBigIndex j = startColumn_[iBasic];
-                                   j < startColumn_[iBasic+1]; j++) {
-                              int jRow = row_[j];
-                              djMod -= duals[jRow] * element_[j];
-                         }
-                         djMod += cost_[iBasic];
-                         // See if gub slack possible - dj is djMod
-                         if (getStatus(iSet) == ClpSimplex::atLowerBound) {
-                              double value = -djMod;
-                              if (value > tolerance) {
-                                   numberWanted--;
-                                   if (value > bestDj) {
-                                        // check flagged variable and correct dj
-                                        if (!flagged(iSet)) {
-                                             bestDj = value;
-                                             bestSequence = slackOffset + iSet;
-                                             bestDjMod = djMod;
-                                             bestSet = iSet;
-                                        } else {
-                                             // just to make sure we don't exit before got something
-                                             numberWanted++;
-                                             abort();
-                                        }
-                                   }
-                              }
-                         } else if (getStatus(iSet) == ClpSimplex::atUpperBound) {
-                              double value = djMod;
-                              if (value > tolerance) {
-                                   numberWanted--;
-                                   if (value > bestDj) {
-                                        // check flagged variable and correct dj
-                                        if (!flagged(iSet)) {
-                                             bestDj = value;
-                                             bestSequence = slackOffset + iSet;
-                                             bestDjMod = djMod;
-                                             bestSet = iSet;
-                                        } else {
-                                             // just to make sure we don't exit before got something
-                                             numberWanted++;
-                                             abort();
-                                        }
-                                   }
-                              }
-                         }
-                    }
-               }
-               // do ones in small
-               int iSequence = startSet_[iSet];
-               while (iSequence >= 0) {
-                    DynamicStatus status = getDynamicStatus(iSequence);
-                    if (status == atLowerBound || status == atUpperBound) {
-                         double value = cost_[iSequence] - djMod;
-                         for (CoinBigIndex j = startColumn_[iSequence];
-                                   j < startColumn_[iSequence+1]; j++) {
-                              int jRow = row_[j];
-                              value -= duals[jRow] * element_[j];
-                         }
-                         // change sign if at lower bound
-                         if (status == atLowerBound)
-                              value = -value;
-                         if (value > tolerance) {
-                              numberWanted--;
-                              if (value > bestDj) {
-                                   // check flagged variable and correct dj
-                                   if (!flagged(iSequence)) {
-                                        bestDj = value;
-                                        bestSequence = structuralOffset + iSequence;
-                                        bestDjMod = djMod;
-                                        bestSet = iSet;
-                                   } else {
-                                        // just to make sure we don't exit before got something
-                                        numberWanted++;
-                                   }
-                              }
-                         }
-                    }
-                    iSequence = next_[iSequence]; //onto next in set
-               }
-               // and now get best by column generation
-               // If no upper bounds we may not need status test
-               for (iSequence = fullStartGen_[iSet]; iSequence < fullStartGen_[iSet+1]; iSequence++) {
-                    DynamicStatus status = getDynamicStatusGen(iSequence);
-                    assert (status != atUpperBound && status != soloKey);
-                    if (status == atLowerBound) {
-                         double value = costGen_[iSequence] - djMod;
-                         for (CoinBigIndex j = startColumnGen_[iSequence];
-                                   j < startColumnGen_[iSequence+1]; j++) {
-                              int jRow = rowGen_[j];
-                              value -= duals[jRow] * elementGen_[j];
-                         }
-                         // change sign as at lower bound
-                         value = -value;
-                         if (value > tolerance) {
-                              numberWanted--;
-                              if (value > bestDj) {
-                                   // check flagged variable and correct dj
-                                   if (!flaggedGen(iSequence)) {
-                                        bestDj = value;
-                                        bestSequence = structuralOffset2 + iSequence;
-                                        bestDjMod = djMod;
-                                        bestSet = iSet;
-                                   } else {
-                                        // just to make sure we don't exit before got something
-                                        numberWanted++;
-                                   }
-                              }
-                         }
-                    }
-               }
-               if (numberWanted <= 0) {
-                    numberWanted = 0;
-                    break;
-               }
-          }
-          if (bestSequence != saveSequence) {
-               savedBestGubDual_ = bestDjMod;
-               savedBestDj_ = bestDj;
-               savedBestSequence_ = bestSequence;
-               savedBestSet_ = bestSet;
-          }
-          // Do packed part before gub
-          // always???
-          // Resize so just do to gub
-          numberActiveColumns_ = firstDynamic_;
-          int saveMinNeg = minimumGoodReducedCosts_;
-          if (bestSequence >= 0)
-               minimumGoodReducedCosts_ = -2;
-          currentWanted_ = numberWanted;
-          ClpPackedMatrix::partialPricing(model, startFraction, endFraction, bestSequence, numberWanted);
-          numberActiveColumns_ = matrix_->getNumCols();
-          minimumGoodReducedCosts_ = saveMinNeg;
-          // See if may be finished
-          if (!startG2 && bestSequence < 0)
-               infeasibilityWeight_ = model_->infeasibilityCost();
-          else if (bestSequence >= 0)
-               infeasibilityWeight_ = -1.0;
-          currentWanted_ = numberWanted;
-     }
-}
-/* Creates a variable.  This is called after partial pricing and may modify matrix.
-   May update bestSequence.
-*/
-void
-ClpDynamicExampleMatrix::createVariable(ClpSimplex * model, int & bestSequence)
-{
-     int numberRows = model->numberRows();
-     int slackOffset = lastDynamic_ + numberRows;
-     int structuralOffset = slackOffset + numberSets_;
-     int bestSequence2 = savedBestSequence_ - structuralOffset;
-     if (bestSequence2 >= 0) {
-          // See if needs new
-          if (bestSequence2 >= maximumGubColumns_) {
-               bestSequence2 -= maximumGubColumns_;
-               int sequence = addColumn(startColumnGen_[bestSequence2+1] - startColumnGen_[bestSequence2],
-                                        rowGen_ + startColumnGen_[bestSequence2],
-                                        elementGen_ + startColumnGen_[bestSequence2],
-                                        costGen_[bestSequence2],
-                                        columnLowerGen_ ? columnLowerGen_[bestSequence2] : 0,
-                                        columnUpperGen_ ? columnUpperGen_[bestSequence2] : 1.0e30,
-                                        savedBestSet_, getDynamicStatusGen(bestSequence2));
-               savedBestSequence_ = structuralOffset + sequence;
-               idGen_[sequence] = bestSequence2;
-               setDynamicStatusGen(bestSequence2, inSmall);
-          }
-     }
-     ClpDynamicMatrix::createVariable(model, bestSequence/*, bestSequence2*/);
-     // clear for next iteration
-     savedBestSequence_ = -1;
-}
-/* If addColumn forces compression then this allows descendant to know what to do.
-   If >=0 then entry stayed in, if -1 then entry went out to lower bound.of zero.
-   Entries at upper bound (really nonzero) never go out (at present).
-*/
-void
-ClpDynamicExampleMatrix::packDown(const int * in, int numberToPack)
-{
-     int put = 0;
-     for (int i = 0; i < numberToPack; i++) {
-          int id = idGen_[i];
-          if (in[i] >= 0) {
-               // stays in
-               assert (put == in[i]); // true for now
-               idGen_[put++] = id;
-          } else {
-               // out to lower bound
-               setDynamicStatusGen(id, atLowerBound);
-          }
-     }
-     assert (put == numberGubColumns_);
-}
diff --git a/cbits/coin/ClpGubDynamicMatrix.cpp b/cbits/coin/ClpGubDynamicMatrix.cpp
deleted file mode 100644
--- a/cbits/coin/ClpGubDynamicMatrix.cpp
+++ /dev/null
@@ -1,2166 +0,0 @@
-/* $Id: ClpGubDynamicMatrix.cpp 1732 2011-05-31 08:09:41Z forrest $ */
-// Copyright (C) 2002, International Business Machines
-// Corporation and others.  All Rights Reserved.
-// This code is licensed under the terms of the Eclipse Public License (EPL).
-
-
-#include <cstdio>
-
-#include "CoinPragma.hpp"
-#include "CoinIndexedVector.hpp"
-#include "CoinHelperFunctions.hpp"
-
-#include "ClpSimplex.hpp"
-#include "ClpFactorization.hpp"
-#include "ClpQuadraticObjective.hpp"
-#include "ClpNonLinearCost.hpp"
-// at end to get min/max!
-#include "ClpGubDynamicMatrix.hpp"
-#include "ClpMessage.hpp"
-//#define CLP_DEBUG
-//#define CLP_DEBUG_PRINT
-//#############################################################################
-// Constructors / Destructor / Assignment
-//#############################################################################
-
-//-------------------------------------------------------------------
-// Default Constructor
-//-------------------------------------------------------------------
-ClpGubDynamicMatrix::ClpGubDynamicMatrix ()
-     : ClpGubMatrix(),
-       objectiveOffset_(0.0),
-       startColumn_(NULL),
-       row_(NULL),
-       element_(NULL),
-       cost_(NULL),
-       fullStart_(NULL),
-       id_(NULL),
-       dynamicStatus_(NULL),
-       lowerColumn_(NULL),
-       upperColumn_(NULL),
-       lowerSet_(NULL),
-       upperSet_(NULL),
-       numberGubColumns_(0),
-       firstAvailable_(0),
-       savedFirstAvailable_(0),
-       firstDynamic_(0),
-       lastDynamic_(0),
-       numberElements_(0)
-{
-     setType(13);
-}
-
-//-------------------------------------------------------------------
-// Copy constructor
-//-------------------------------------------------------------------
-ClpGubDynamicMatrix::ClpGubDynamicMatrix (const ClpGubDynamicMatrix & rhs)
-     : ClpGubMatrix(rhs)
-{
-     objectiveOffset_ = rhs.objectiveOffset_;
-     numberGubColumns_ = rhs.numberGubColumns_;
-     firstAvailable_ = rhs.firstAvailable_;
-     savedFirstAvailable_ = rhs.savedFirstAvailable_;
-     firstDynamic_ = rhs.firstDynamic_;
-     lastDynamic_ = rhs.lastDynamic_;
-     numberElements_ = rhs.numberElements_;
-     startColumn_ = ClpCopyOfArray(rhs.startColumn_, numberGubColumns_ + 1);
-     CoinBigIndex numberElements = startColumn_[numberGubColumns_];
-     row_ = ClpCopyOfArray(rhs.row_, numberElements);;
-     element_ = ClpCopyOfArray(rhs.element_, numberElements);;
-     cost_ = ClpCopyOfArray(rhs.cost_, numberGubColumns_);
-     fullStart_ = ClpCopyOfArray(rhs.fullStart_, numberSets_ + 1);
-     id_ = ClpCopyOfArray(rhs.id_, lastDynamic_ - firstDynamic_);
-     lowerColumn_ = ClpCopyOfArray(rhs.lowerColumn_, numberGubColumns_);
-     upperColumn_ = ClpCopyOfArray(rhs.upperColumn_, numberGubColumns_);
-     dynamicStatus_ = ClpCopyOfArray(rhs.dynamicStatus_, numberGubColumns_);
-     lowerSet_ = ClpCopyOfArray(rhs.lowerSet_, numberSets_);
-     upperSet_ = ClpCopyOfArray(rhs.upperSet_, numberSets_);
-}
-
-/* This is the real constructor*/
-ClpGubDynamicMatrix::ClpGubDynamicMatrix(ClpSimplex * model, int numberSets,
-          int numberGubColumns, const int * starts,
-          const double * lower, const double * upper,
-          const CoinBigIndex * startColumn, const int * row,
-          const double * element, const double * cost,
-          const double * lowerColumn, const double * upperColumn,
-          const unsigned char * status)
-     : ClpGubMatrix()
-{
-     objectiveOffset_ = model->objectiveOffset();
-     model_ = model;
-     numberSets_ = numberSets;
-     numberGubColumns_ = numberGubColumns;
-     fullStart_ = ClpCopyOfArray(starts, numberSets_ + 1);
-     lower_ = ClpCopyOfArray(lower, numberSets_);
-     upper_ = ClpCopyOfArray(upper, numberSets_);
-     int numberColumns = model->numberColumns();
-     int numberRows = model->numberRows();
-     // Number of columns needed
-     int numberGubInSmall = numberSets_ + numberRows + 2 * model->factorizationFrequency() + 2;
-     // for small problems this could be too big
-     //numberGubInSmall = CoinMin(numberGubInSmall,numberGubColumns_);
-     int numberNeeded = numberGubInSmall + numberColumns;
-     firstAvailable_ = numberColumns;
-     savedFirstAvailable_ = numberColumns;
-     firstDynamic_ = numberColumns;
-     lastDynamic_ = numberNeeded;
-     startColumn_ = ClpCopyOfArray(startColumn, numberGubColumns_ + 1);
-     CoinBigIndex numberElements = startColumn_[numberGubColumns_];
-     row_ = ClpCopyOfArray(row, numberElements);
-     element_ = new double[numberElements];
-     CoinBigIndex i;
-     for (i = 0; i < numberElements; i++)
-          element_[i] = element[i];
-     cost_ = new double[numberGubColumns_];
-     for (i = 0; i < numberGubColumns_; i++) {
-          cost_[i] = cost[i];
-          // need sorted
-          CoinSort_2(row_ + startColumn_[i], row_ + startColumn_[i+1], element_ + startColumn_[i]);
-     }
-     if (lowerColumn) {
-          lowerColumn_ = new double[numberGubColumns_];
-          for (i = 0; i < numberGubColumns_; i++)
-               lowerColumn_[i] = lowerColumn[i];
-     } else {
-          lowerColumn_ = NULL;
-     }
-     if (upperColumn) {
-          upperColumn_ = new double[numberGubColumns_];
-          for (i = 0; i < numberGubColumns_; i++)
-               upperColumn_[i] = upperColumn[i];
-     } else {
-          upperColumn_ = NULL;
-     }
-     if (upperColumn || lowerColumn) {
-          lowerSet_ = new double[numberSets_];
-          for (i = 0; i < numberSets_; i++) {
-               if (lower[i] > -1.0e20)
-                    lowerSet_[i] = lower[i];
-               else
-                    lowerSet_[i] = -1.0e30;
-          }
-          upperSet_ = new double[numberSets_];
-          for (i = 0; i < numberSets_; i++) {
-               if (upper[i] < 1.0e20)
-                    upperSet_[i] = upper[i];
-               else
-                    upperSet_[i] = 1.0e30;
-          }
-     } else {
-          lowerSet_ = NULL;
-          upperSet_ = NULL;
-     }
-     start_ = NULL;
-     end_ = NULL;
-     dynamicStatus_ = NULL;
-     id_ = new int[numberGubInSmall];
-     for (i = 0; i < numberGubInSmall; i++)
-          id_[i] = -1;
-     ClpPackedMatrix* originalMatrixA =
-          dynamic_cast< ClpPackedMatrix*>(model->clpMatrix());
-     assert (originalMatrixA);
-     CoinPackedMatrix * originalMatrix = originalMatrixA->getPackedMatrix();
-     originalMatrixA->setMatrixNull(); // so can be deleted safely
-     // guess how much space needed
-     double guess = originalMatrix->getNumElements() + 10;
-     guess /= static_cast<double> (numberColumns);
-     guess *= 2 * numberGubColumns_;
-     numberElements_ = static_cast<int> (CoinMin(guess, 10000000.0));
-     numberElements_ = CoinMin(numberElements_, numberElements) + originalMatrix->getNumElements();
-     matrix_ = originalMatrix;
-     flags_ &= ~1;
-     // resize model (matrix stays same)
-     model->resize(numberRows, numberNeeded);
-     if (upperColumn_) {
-          // set all upper bounds so we have enough space
-          double * columnUpper = model->columnUpper();
-          for(i = firstDynamic_; i < lastDynamic_; i++)
-               columnUpper[i] = 1.0e10;
-     }
-     // resize matrix
-     // extra 1 is so can keep number of elements handy
-     originalMatrix->reserve(numberNeeded, numberElements_, true);
-     originalMatrix->reserve(numberNeeded + 1, numberElements_, false);
-     originalMatrix->getMutableVectorStarts()[numberColumns] = originalMatrix->getNumElements();
-     // redo number of columns
-     numberColumns = matrix_->getNumCols();
-     backward_ = new int[numberNeeded];
-     backToPivotRow_ = new int[numberNeeded];
-     // We know a bit better
-     delete [] changeCost_;
-     changeCost_ = new double [numberRows+numberSets_];
-     keyVariable_ = new int[numberSets_];
-     // signal to need new ordering
-     next_ = NULL;
-     for (int iColumn = 0; iColumn < numberNeeded; iColumn++)
-          backward_[iColumn] = -1;
-
-     firstGub_ = firstDynamic_;
-     lastGub_ = lastDynamic_;
-     if (!lowerColumn_ && !upperColumn_)
-          gubType_ = 8;
-     if (status) {
-          status_ = ClpCopyOfArray(status, numberSets_);
-     } else {
-          status_ = new unsigned char [numberSets_];
-          memset(status_, 0, numberSets_);
-          int i;
-          for (i = 0; i < numberSets_; i++) {
-               // make slack key
-               setStatus(i, ClpSimplex::basic);
-          }
-     }
-     saveStatus_ = new unsigned char [numberSets_];
-     memset(saveStatus_, 0, numberSets_);
-     savedKeyVariable_ = new int [numberSets_];
-     memset(savedKeyVariable_, 0, numberSets_ * sizeof(int));
-}
-
-//-------------------------------------------------------------------
-// Destructor
-//-------------------------------------------------------------------
-ClpGubDynamicMatrix::~ClpGubDynamicMatrix ()
-{
-     delete [] startColumn_;
-     delete [] row_;
-     delete [] element_;
-     delete [] cost_;
-     delete [] fullStart_;
-     delete [] id_;
-     delete [] dynamicStatus_;
-     delete [] lowerColumn_;
-     delete [] upperColumn_;
-     delete [] lowerSet_;
-     delete [] upperSet_;
-}
-
-//----------------------------------------------------------------
-// Assignment operator
-//-------------------------------------------------------------------
-ClpGubDynamicMatrix &
-ClpGubDynamicMatrix::operator=(const ClpGubDynamicMatrix& rhs)
-{
-     if (this != &rhs) {
-          ClpGubMatrix::operator=(rhs);
-          delete [] startColumn_;
-          delete [] row_;
-          delete [] element_;
-          delete [] cost_;
-          delete [] fullStart_;
-          delete [] id_;
-          delete [] dynamicStatus_;
-          delete [] lowerColumn_;
-          delete [] upperColumn_;
-          delete [] lowerSet_;
-          delete [] upperSet_;
-          objectiveOffset_ = rhs.objectiveOffset_;
-          numberGubColumns_ = rhs.numberGubColumns_;
-          firstAvailable_ = rhs.firstAvailable_;
-          savedFirstAvailable_ = rhs.savedFirstAvailable_;
-          firstDynamic_ = rhs.firstDynamic_;
-          lastDynamic_ = rhs.lastDynamic_;
-          numberElements_ = rhs.numberElements_;
-          startColumn_ = ClpCopyOfArray(rhs.startColumn_, numberGubColumns_ + 1);
-          int numberElements = startColumn_[numberGubColumns_];
-          row_ = ClpCopyOfArray(rhs.row_, numberElements);;
-          element_ = ClpCopyOfArray(rhs.element_, numberElements);;
-          cost_ = ClpCopyOfArray(rhs.cost_, numberGubColumns_);
-          fullStart_ = ClpCopyOfArray(rhs.fullStart_, numberSets_ + 1);
-          id_ = ClpCopyOfArray(rhs.id_, lastDynamic_ - firstDynamic_);
-          lowerColumn_ = ClpCopyOfArray(rhs.lowerColumn_, numberGubColumns_);
-          upperColumn_ = ClpCopyOfArray(rhs.upperColumn_, numberGubColumns_);
-          dynamicStatus_ = ClpCopyOfArray(rhs.dynamicStatus_, numberGubColumns_);
-          lowerSet_ = ClpCopyOfArray(rhs.lowerSet_, numberSets_);
-          upperSet_ = ClpCopyOfArray(rhs.upperSet_, numberSets_);
-     }
-     return *this;
-}
-//-------------------------------------------------------------------
-// Clone
-//-------------------------------------------------------------------
-ClpMatrixBase * ClpGubDynamicMatrix::clone() const
-{
-     return new ClpGubDynamicMatrix(*this);
-}
-// Partial pricing
-void
-ClpGubDynamicMatrix::partialPricing(ClpSimplex * model, double startFraction, double endFraction,
-                                    int & bestSequence, int & numberWanted)
-{
-     assert(!model->rowScale());
-     numberWanted = currentWanted_;
-     if (!numberSets_) {
-          // no gub
-          ClpPackedMatrix::partialPricing(model, startFraction, endFraction, bestSequence, numberWanted);
-          return;
-     } else {
-          // and do some proportion of full set
-          int startG2 = static_cast<int> (startFraction * numberSets_);
-          int endG2 = static_cast<int> (endFraction * numberSets_ + 0.1);
-          endG2 = CoinMin(endG2, numberSets_);
-          //printf("gub price - set start %d end %d\n",
-          //   startG2,endG2);
-          double tolerance = model->currentDualTolerance();
-          double * reducedCost = model->djRegion();
-          const double * duals = model->dualRowSolution();
-          double * cost = model->costRegion();
-          double bestDj;
-          int numberRows = model->numberRows();
-          int numberColumns = lastDynamic_;
-          // If nothing found yet can go all the way to end
-          int endAll = endG2;
-          if (bestSequence < 0 && !startG2)
-               endAll = numberSets_;
-          if (bestSequence >= 0)
-               bestDj = fabs(reducedCost[bestSequence]);
-          else
-               bestDj = tolerance;
-          int saveSequence = bestSequence;
-          double djMod = 0.0;
-          double infeasibilityCost = model->infeasibilityCost();
-          double bestDjMod = 0.0;
-          //printf("iteration %d start %d end %d - wanted %d\n",model->numberIterations(),
-          //     startG2,endG2,numberWanted);
-          int bestType = -1;
-          int bestSet = -1;
-          const double * element = matrix_->getElements();
-          const int * row = matrix_->getIndices();
-          const CoinBigIndex * startColumn = matrix_->getVectorStarts();
-          int * length = matrix_->getMutableVectorLengths();
-#if 0
-          // make sure first available is clean (in case last iteration rejected)
-          cost[firstAvailable_] = 0.0;
-          length[firstAvailable_] = 0;
-          model->nonLinearCost()->setOne(firstAvailable_, 0.0, 0.0, COIN_DBL_MAX, 0.0);
-          model->setStatus(firstAvailable_, ClpSimplex::atLowerBound);
-          {
-               for (int i = firstAvailable_; i < lastDynamic_; i++)
-                    assert(!cost[i]);
-          }
-#endif
-#ifdef CLP_DEBUG
-          {
-               for (int i = firstDynamic_; i < firstAvailable_; i++) {
-                    assert (getDynamicStatus(id_[i-firstDynamic_]) == inSmall);
-               }
-          }
-#endif
-          int minSet = minimumObjectsScan_ < 0 ? 5 : minimumObjectsScan_;
-          int minNeg = minimumGoodReducedCosts_ < 0 ? 5 : minimumGoodReducedCosts_;
-          for (int iSet = startG2; iSet < endAll; iSet++) {
-               if (numberWanted + minNeg < originalWanted_ && iSet > startG2 + minSet) {
-                    // give up
-                    numberWanted = 0;
-                    break;
-               } else if (iSet == endG2 && bestSequence >= 0) {
-                    break;
-               }
-               CoinBigIndex j;
-               int iBasic = keyVariable_[iSet];
-               if (iBasic >= numberColumns) {
-                    djMod = - weight(iSet) * infeasibilityCost;
-               } else {
-                    // get dj without
-                    assert (model->getStatus(iBasic) == ClpSimplex::basic);
-                    djMod = 0.0;
-
-                    for (j = startColumn[iBasic];
-                              j < startColumn[iBasic] + length[iBasic]; j++) {
-                         int jRow = row[j];
-                         djMod -= duals[jRow] * element[j];
-                    }
-                    djMod += cost[iBasic];
-                    // See if gub slack possible - dj is djMod
-                    if (getStatus(iSet) == ClpSimplex::atLowerBound) {
-                         double value = -djMod;
-                         if (value > tolerance) {
-                              numberWanted--;
-                              if (value > bestDj) {
-                                   // check flagged variable and correct dj
-                                   if (!flagged(iSet)) {
-                                        bestDj = value;
-                                        bestSequence = numberRows + numberColumns + iSet;
-                                        bestDjMod = djMod;
-                                        bestType = 0;
-                                        bestSet = iSet;
-                                   } else {
-                                        // just to make sure we don't exit before got something
-                                        numberWanted++;
-                                        abort();
-                                   }
-                              }
-                         }
-                    } else if (getStatus(iSet) == ClpSimplex::atUpperBound) {
-                         double value = djMod;
-                         if (value > tolerance) {
-                              numberWanted--;
-                              if (value > bestDj) {
-                                   // check flagged variable and correct dj
-                                   if (!flagged(iSet)) {
-                                        bestDj = value;
-                                        bestSequence = numberRows + numberColumns + iSet;
-                                        bestDjMod = djMod;
-                                        bestType = 0;
-                                        bestSet = iSet;
-                                   } else {
-                                        // just to make sure we don't exit before got something
-                                        numberWanted++;
-                                        abort();
-                                   }
-                              }
-                         }
-                    }
-               }
-               for (int iSequence = fullStart_[iSet]; iSequence < fullStart_[iSet+1]; iSequence++) {
-                    DynamicStatus status = getDynamicStatus(iSequence);
-                    if (status != inSmall) {
-                         double value = cost_[iSequence] - djMod;
-                         for (j = startColumn_[iSequence];
-                                   j < startColumn_[iSequence+1]; j++) {
-                              int jRow = row_[j];
-                              value -= duals[jRow] * element_[j];
-                         }
-                         // change sign if at lower bound
-                         if (status == atLowerBound)
-                              value = -value;
-                         if (value > tolerance) {
-                              numberWanted--;
-                              if (value > bestDj) {
-                                   // check flagged variable and correct dj
-                                   if (!flagged(iSequence)) {
-                                        bestDj = value;
-                                        bestSequence = iSequence;
-                                        bestDjMod = djMod;
-                                        bestType = 1;
-                                        bestSet = iSet;
-                                   } else {
-                                        // just to make sure we don't exit before got something
-                                        numberWanted++;
-                                   }
-                              }
-                         }
-                    }
-               }
-               if (numberWanted <= 0) {
-                    numberWanted = 0;
-                    break;
-               }
-          }
-          // Do packed part before gub and small gub - but lightly
-          int saveMinNeg = minimumGoodReducedCosts_;
-          int saveSequence2 = bestSequence;
-          if (bestSequence >= 0)
-               minimumGoodReducedCosts_ = -2;
-          int saveLast = lastGub_;
-          lastGub_ = firstAvailable_;
-          currentWanted_ = numberWanted;
-          ClpGubMatrix::partialPricing(model, startFraction, endFraction, bestSequence, numberWanted);
-          minimumGoodReducedCosts_ = saveMinNeg;
-          lastGub_ = saveLast;
-          if (bestSequence != saveSequence2) {
-               bestType = -1; // in normal or small gub part
-               saveSequence = bestSequence;
-          }
-          if (bestSequence != saveSequence || bestType >= 0) {
-               double * lowerColumn = model->lowerRegion();
-               double * upperColumn = model->upperRegion();
-               double * solution = model->solutionRegion();
-               if (bestType > 0) {
-                    // recompute dj and create
-                    double value = cost_[bestSequence] - bestDjMod;
-                    for (CoinBigIndex jBigIndex = startColumn_[bestSequence];
-                              jBigIndex < startColumn_[bestSequence+1]; jBigIndex++) {
-                         int jRow = row_[jBigIndex];
-                         value -= duals[jRow] * element_[jBigIndex];
-                    }
-                    double * element =  matrix_->getMutableElements();
-                    int * row = matrix_->getMutableIndices();
-                    CoinBigIndex * startColumn = matrix_->getMutableVectorStarts();
-                    int * length = matrix_->getMutableVectorLengths();
-                    CoinBigIndex numberElements = startColumn[firstAvailable_];
-                    int numberThis = startColumn_[bestSequence+1] - startColumn_[bestSequence];
-                    if (numberElements + numberThis > numberElements_) {
-                         // need to redo
-                         numberElements_ = CoinMax(3 * numberElements_ / 2, numberElements + numberThis);
-                         matrix_->reserve(numberColumns, numberElements_);
-                         element =  matrix_->getMutableElements();
-                         row = matrix_->getMutableIndices();
-                         // these probably okay but be safe
-                         startColumn = matrix_->getMutableVectorStarts();
-                         length = matrix_->getMutableVectorLengths();
-                    }
-                    // already set startColumn[firstAvailable_]=numberElements;
-                    length[firstAvailable_] = numberThis;
-                    model->costRegion()[firstAvailable_] = cost_[bestSequence];
-                    CoinBigIndex base = startColumn_[bestSequence];
-                    for (int j = 0; j < numberThis; j++) {
-                         row[numberElements] = row_[base+j];
-                         element[numberElements++] = element_[base+j];
-                    }
-                    id_[firstAvailable_-firstDynamic_] = bestSequence;
-                    //printf("best %d\n",bestSequence);
-                    backward_[firstAvailable_] = bestSet;
-                    model->solutionRegion()[firstAvailable_] = 0.0;
-                    if (!lowerColumn_ && !upperColumn_) {
-                         model->setStatus(firstAvailable_, ClpSimplex::atLowerBound);
-                         lowerColumn[firstAvailable_] = 0.0;
-                         upperColumn[firstAvailable_] = COIN_DBL_MAX;
-                    }  else {
-                         DynamicStatus status = getDynamicStatus(bestSequence);
-                         if (lowerColumn_)
-                              lowerColumn[firstAvailable_] = lowerColumn_[bestSequence];
-                         else
-                              lowerColumn[firstAvailable_] = 0.0;
-                         if (upperColumn_)
-                              upperColumn[firstAvailable_] = upperColumn_[bestSequence];
-                         else
-                              upperColumn[firstAvailable_] = COIN_DBL_MAX;
-                         if (status == atLowerBound) {
-                              solution[firstAvailable_] = lowerColumn[firstAvailable_];
-                              model->setStatus(firstAvailable_, ClpSimplex::atLowerBound);
-                         } else {
-                              solution[firstAvailable_] = upperColumn[firstAvailable_];
-                              model->setStatus(firstAvailable_, ClpSimplex::atUpperBound);
-                         }
-                    }
-                    model->nonLinearCost()->setOne(firstAvailable_, solution[firstAvailable_],
-                                                   lowerColumn[firstAvailable_],
-                                                   upperColumn[firstAvailable_], cost_[bestSequence]);
-                    bestSequence = firstAvailable_;
-                    // firstAvailable_ only updated if good pivot (in updatePivot)
-                    startColumn[firstAvailable_+1] = numberElements;
-                    //printf("price struct %d - dj %g gubpi %g\n",bestSequence,value,bestDjMod);
-                    reducedCost[bestSequence] = value;
-                    gubSlackIn_ = -1;
-               } else {
-                    // slack - make last column
-                    gubSlackIn_ = bestSequence - numberRows - numberColumns;
-                    bestSequence = numberColumns + 2 * numberRows;
-                    reducedCost[bestSequence] = bestDjMod;
-                    //printf("price slack %d - gubpi %g\n",gubSlackIn_,bestDjMod);
-                    model->setStatus(bestSequence, getStatus(gubSlackIn_));
-                    if (getStatus(gubSlackIn_) == ClpSimplex::atUpperBound)
-                         solution[bestSequence] = upper_[gubSlackIn_];
-                    else
-                         solution[bestSequence] = lower_[gubSlackIn_];
-                    lowerColumn[bestSequence] = lower_[gubSlackIn_];
-                    upperColumn[bestSequence] = upper_[gubSlackIn_];
-                    model->costRegion()[bestSequence] = 0.0;
-                    model->nonLinearCost()->setOne(bestSequence, solution[bestSequence], lowerColumn[bestSequence],
-                                                   upperColumn[bestSequence], 0.0);
-               }
-               savedBestSequence_ = bestSequence;
-               savedBestDj_ = reducedCost[savedBestSequence_];
-          }
-          // See if may be finished
-          if (!startG2 && bestSequence < 0)
-               infeasibilityWeight_ = model_->infeasibilityCost();
-          else if (bestSequence >= 0)
-               infeasibilityWeight_ = -1.0;
-     }
-     currentWanted_ = numberWanted;
-}
-// This is local to Gub to allow synchronization when status is good
-int
-ClpGubDynamicMatrix::synchronize(ClpSimplex * model, int mode)
-{
-     int returnNumber = 0;
-     switch (mode) {
-     case 0: {
-#ifdef CLP_DEBUG
-          {
-               for (int i = 0; i < numberSets_; i++)
-                    assert(toIndex_[i] == -1);
-          }
-#endif
-          // lookup array
-          int * lookup = new int[lastDynamic_];
-          int iColumn;
-          int numberColumns = model->numberColumns();
-          double * element =  matrix_->getMutableElements();
-          int * row = matrix_->getMutableIndices();
-          CoinBigIndex * startColumn = matrix_->getMutableVectorStarts();
-          int * length = matrix_->getMutableVectorLengths();
-          double * cost = model->costRegion();
-          double * lowerColumn = model->lowerRegion();
-          double * upperColumn = model->upperRegion();
-          int * pivotVariable = model->pivotVariable();
-          CoinBigIndex numberElements = startColumn[firstDynamic_];
-          // first just do lookup and basic stuff
-          int currentNumber = firstAvailable_;
-          firstAvailable_ = firstDynamic_;
-          int numberToDo = 0;
-          double objectiveChange = 0.0;
-          double * solution = model->solutionRegion();
-          for (iColumn = firstDynamic_; iColumn < currentNumber; iColumn++) {
-               int iSet = backward_[iColumn];
-               if (toIndex_[iSet] < 0) {
-                    toIndex_[iSet] = 0;
-                    fromIndex_[numberToDo++] = iSet;
-               }
-               if (model->getStatus(iColumn) == ClpSimplex::basic || iColumn == keyVariable_[iSet]) {
-                    lookup[iColumn] = firstAvailable_;
-                    if (iColumn != keyVariable_[iSet]) {
-                         int iPivot = backToPivotRow_[iColumn];
-                         backToPivotRow_[firstAvailable_] = iPivot;
-                         pivotVariable[iPivot] = firstAvailable_;
-                    }
-                    firstAvailable_++;
-               } else {
-                    int jColumn = id_[iColumn-firstDynamic_];
-                    setDynamicStatus(jColumn, atLowerBound);
-                    if (lowerColumn_ || upperColumn_) {
-                         if (model->getStatus(iColumn) == ClpSimplex::atUpperBound)
-                              setDynamicStatus(jColumn, atUpperBound);
-                         // treat solution as if exactly at a bound
-                         double value = solution[iColumn];
-                         if (fabs(value - lowerColumn[iColumn]) < fabs(value - upperColumn[iColumn]))
-                              value = lowerColumn[iColumn];
-                         else
-                              value = upperColumn[iColumn];
-                         objectiveChange += cost[iColumn] * value;
-                         // redo lower and upper on sets
-                         double shift = value;
-                         if (lowerSet_[iSet] > -1.0e20)
-                              lower_[iSet] = lowerSet_[iSet] - shift;
-                         if (upperSet_[iSet] < 1.0e20)
-                              upper_[iSet] = upperSet_[iSet] - shift;
-                    }
-                    lookup[iColumn] = -1;
-               }
-          }
-          model->setObjectiveOffset(model->objectiveOffset() + objectiveChange);
-          firstAvailable_ = firstDynamic_;
-          for (iColumn = firstDynamic_; iColumn < currentNumber; iColumn++) {
-               if (lookup[iColumn] >= 0) {
-                    // move
-                    int jColumn = id_[iColumn-firstDynamic_];
-                    id_[firstAvailable_-firstDynamic_] = jColumn;
-                    int numberThis = startColumn_[jColumn+1] - startColumn_[jColumn];
-                    length[firstAvailable_] = numberThis;
-                    cost[firstAvailable_] = cost[iColumn];
-                    lowerColumn[firstAvailable_] = lowerColumn[iColumn];
-                    upperColumn[firstAvailable_] = upperColumn[iColumn];
-                    double originalLower = lowerColumn_ ? lowerColumn_[jColumn] : 0.0;
-                    double originalUpper = upperColumn_ ? upperColumn_[jColumn] : COIN_DBL_MAX;
-                    if (originalUpper > 1.0e30)
-                         originalUpper = COIN_DBL_MAX;
-                    model->nonLinearCost()->setOne(firstAvailable_, solution[iColumn],
-                                                   originalLower, originalUpper,
-                                                   cost_[jColumn]);
-                    CoinBigIndex base = startColumn_[jColumn];
-                    for (int j = 0; j < numberThis; j++) {
-                         row[numberElements] = row_[base+j];
-                         element[numberElements++] = element_[base+j];
-                    }
-                    model->setStatus(firstAvailable_, model->getStatus(iColumn));
-                    backward_[firstAvailable_] = backward_[iColumn];
-                    solution[firstAvailable_] = solution[iColumn];
-                    firstAvailable_++;
-                    startColumn[firstAvailable_] = numberElements;
-               }
-          }
-          // clean up next_
-          int * temp = new int [firstAvailable_];
-          for (int jSet = 0; jSet < numberToDo; jSet++) {
-               int iSet = fromIndex_[jSet];
-               toIndex_[iSet] = -1;
-               int last = keyVariable_[iSet];
-               int j = next_[last];
-               bool setTemp = true;
-               if (last < lastDynamic_) {
-                    last = lookup[last];
-                    assert (last >= 0);
-                    keyVariable_[iSet] = last;
-               } else if (j >= 0) {
-                    int newJ = lookup[j];
-                    assert (newJ >= 0);
-                    j = next_[j];
-                    next_[last] = newJ;
-                    last = newJ;
-               } else {
-                    next_[last] = -(iSet + numberColumns + 1);
-                    setTemp = false;
-               }
-               while (j >= 0) {
-                    int newJ = lookup[j];
-                    assert (newJ >= 0);
-                    temp[last] = newJ;
-                    last = newJ;
-                    j = next_[j];
-               }
-               if (setTemp)
-                    temp[last] = -(keyVariable_[iSet] + 1);
-               if (lowerSet_) {
-                    // we only need to get lower_ and upper_ correct
-                    double shift = 0.0;
-                    for (int j = fullStart_[iSet]; j < fullStart_[iSet+1]; j++)
-                         if (getDynamicStatus(j) == atUpperBound)
-                              shift += upperColumn_[j];
-                         else if (getDynamicStatus(j) == atLowerBound && lowerColumn_)
-                              shift += lowerColumn_[j];
-                    if (lowerSet_[iSet] > -1.0e20)
-                         lower_[iSet] = lowerSet_[iSet] - shift;
-                    if (upperSet_[iSet] < 1.0e20)
-                         upper_[iSet] = upperSet_[iSet] - shift;
-               }
-          }
-          // move to next_
-          CoinMemcpyN(temp + firstDynamic_, (firstAvailable_ - firstDynamic_), next_ + firstDynamic_);
-          // if odd iterations may be one out so adjust currentNumber
-          currentNumber = CoinMin(currentNumber + 1, lastDynamic_);
-          // zero solution
-          CoinZeroN(solution + firstAvailable_, currentNumber - firstAvailable_);
-          // zero cost
-          CoinZeroN(cost + firstAvailable_, currentNumber - firstAvailable_);
-          // zero lengths
-          CoinZeroN(length + firstAvailable_, currentNumber - firstAvailable_);
-          for ( iColumn = firstAvailable_; iColumn < currentNumber; iColumn++) {
-               model->nonLinearCost()->setOne(iColumn, 0.0, 0.0, COIN_DBL_MAX, 0.0);
-               model->setStatus(iColumn, ClpSimplex::atLowerBound);
-               backward_[iColumn] = -1;
-          }
-          delete [] lookup;
-          delete [] temp;
-          // make sure fromIndex clean
-          fromIndex_[0] = -1;
-          //#define CLP_DEBUG
-#ifdef CLP_DEBUG
-          // debug
-          {
-               int i;
-               int numberRows = model->numberRows();
-               char * xxxx = new char[numberColumns];
-               memset(xxxx, 0, numberColumns);
-               for (i = 0; i < numberRows; i++) {
-                    int iPivot = pivotVariable[i];
-                    assert (model->getStatus(iPivot) == ClpSimplex::basic);
-                    if (iPivot < numberColumns && backward_[iPivot] >= 0)
-                         xxxx[iPivot] = 1;
-               }
-               for (i = 0; i < numberSets_; i++) {
-                    int key = keyVariable_[i];
-                    int iColumn = next_[key];
-                    int k = 0;
-                    while(iColumn >= 0) {
-                         k++;
-                         assert (k < 100);
-                         assert (backward_[iColumn] == i);
-                         iColumn = next_[iColumn];
-                    }
-                    int stop = -(key + 1);
-                    while (iColumn != stop) {
-                         assert (iColumn < 0);
-                         iColumn = -iColumn - 1;
-                         k++;
-                         assert (k < 100);
-                         assert (backward_[iColumn] == i);
-                         iColumn = next_[iColumn];
-                    }
-                    iColumn = next_[key];
-                    while (iColumn >= 0) {
-                         assert (xxxx[iColumn]);
-                         xxxx[iColumn] = 0;
-                         iColumn = next_[iColumn];
-                    }
-               }
-               for (i = 0; i < numberColumns; i++) {
-                    if (i < numberColumns && backward_[i] >= 0) {
-                         assert (!xxxx[i] || i == keyVariable_[backward_[i]]);
-                    }
-               }
-               delete [] xxxx;
-          }
-          {
-               for (int i = 0; i < numberSets_; i++)
-                    assert(toIndex_[i] == -1);
-          }
-#endif
-          savedFirstAvailable_ = firstAvailable_;
-     }
-     break;
-     // flag a variable
-     case 1: {
-          // id will be sitting at firstAvailable
-          int sequence = id_[firstAvailable_-firstDynamic_];
-          assert (!flagged(sequence));
-          setFlagged(sequence);
-          model->clearFlagged(firstAvailable_);
-     }
-     break;
-     // unflag all variables
-     case 2: {
-          for (int i = 0; i < numberGubColumns_; i++) {
-               if (flagged(i)) {
-                    unsetFlagged(i);
-                    returnNumber++;
-               }
-          }
-     }
-     break;
-     //  just reset costs and bounds (primal)
-     case 3: {
-          double * cost = model->costRegion();
-          double * solution = model->solutionRegion();
-          double * lowerColumn = model->columnLower();
-          double * upperColumn = model->columnUpper();
-          for (int i = firstDynamic_; i < firstAvailable_; i++) {
-               int jColumn = id_[i-firstDynamic_];
-               cost[i] = cost_[jColumn];
-               if (!lowerColumn_ && !upperColumn_) {
-                    lowerColumn[i] = 0.0;
-                    upperColumn[i] = COIN_DBL_MAX;
-               }  else {
-                    if (lowerColumn_)
-                         lowerColumn[i] = lowerColumn_[jColumn];
-                    else
-                         lowerColumn[i] = 0.0;
-                    if (upperColumn_)
-                         upperColumn[i] = upperColumn_[jColumn];
-                    else
-                         upperColumn[i] = COIN_DBL_MAX;
-               }
-               if (model->nonLinearCost())
-                    model->nonLinearCost()->setOne(i, solution[i],
-                                                   lowerColumn[i],
-                                                   upperColumn[i], cost_[jColumn]);
-          }
-          if (!model->numberIterations() && rhsOffset_) {
-               lastRefresh_ = - refreshFrequency_; // force refresh
-          }
-     }
-     break;
-     // and get statistics for column generation
-     case 4: {
-          // In theory we should subtract out ones we have done but ....
-          // If key slack then dual 0.0
-          // If not then slack could be dual infeasible
-          // dj for key is zero so that defines dual on set
-          int i;
-          int numberColumns = model->numberColumns();
-          double * dual = model->dualRowSolution();
-          double infeasibilityCost = model->infeasibilityCost();
-          double dualTolerance = model->dualTolerance();
-          double relaxedTolerance = dualTolerance;
-          // we can't really trust infeasibilities if there is dual error
-          double error = CoinMin(1.0e-2, model->largestDualError());
-          // allow tolerance at least slightly bigger than standard
-          relaxedTolerance = relaxedTolerance +  error;
-          // but we will be using difference
-          relaxedTolerance -= dualTolerance;
-          double objectiveOffset = 0.0;
-          for (i = 0; i < numberSets_; i++) {
-               int kColumn = keyVariable_[i];
-               double value = 0.0;
-               if (kColumn < numberColumns) {
-                    kColumn = id_[kColumn-firstDynamic_];
-                    // dj without set
-                    value = cost_[kColumn];
-                    for (CoinBigIndex j = startColumn_[kColumn];
-                              j < startColumn_[kColumn+1]; j++) {
-                         int iRow = row_[j];
-                         value -= dual[iRow] * element_[j];
-                    }
-                    double infeasibility = 0.0;
-                    if (getStatus(i) == ClpSimplex::atLowerBound) {
-                         if (-value > dualTolerance)
-                              infeasibility = -value - dualTolerance;
-                    } else if (getStatus(i) == ClpSimplex::atUpperBound) {
-                         if (value > dualTolerance)
-                              infeasibility = value - dualTolerance;
-                    }
-                    if (infeasibility > 0.0) {
-                         sumDualInfeasibilities_ += infeasibility;
-                         if (infeasibility > relaxedTolerance)
-                              sumOfRelaxedDualInfeasibilities_ += infeasibility;
-                         numberDualInfeasibilities_ ++;
-                    }
-               } else {
-                    // slack key - may not be feasible
-                    assert (getStatus(i) == ClpSimplex::basic);
-                    // negative as -1.0 for slack
-                    value = -weight(i) * infeasibilityCost;
-               }
-               // Now subtract out from all
-               for (CoinBigIndex k = fullStart_[i]; k < fullStart_[i+1]; k++) {
-                    if (getDynamicStatus(k) != inSmall) {
-                         double djValue = cost_[k] - value;
-                         for (CoinBigIndex j = startColumn_[k];
-                                   j < startColumn_[k+1]; j++) {
-                              int iRow = row_[j];
-                              djValue -= dual[iRow] * element_[j];
-                         }
-                         double infeasibility = 0.0;
-                         double shift = 0.0;
-                         if (getDynamicStatus(k) == atLowerBound) {
-                              if (lowerColumn_)
-                                   shift = lowerColumn_[k];
-                              if (djValue < -dualTolerance)
-                                   infeasibility = -djValue - dualTolerance;
-                         } else {
-                              // at upper bound
-                              shift = upperColumn_[k];
-                              if (djValue > dualTolerance)
-                                   infeasibility = djValue - dualTolerance;
-                         }
-                         objectiveOffset += shift * cost_[k];
-                         if (infeasibility > 0.0) {
-                              sumDualInfeasibilities_ += infeasibility;
-                              if (infeasibility > relaxedTolerance)
-                                   sumOfRelaxedDualInfeasibilities_ += infeasibility;
-                              numberDualInfeasibilities_ ++;
-                         }
-                    }
-               }
-          }
-          model->setObjectiveOffset(objectiveOffset_ - objectiveOffset);
-     }
-     break;
-     // see if time to re-factorize
-     case 5: {
-          if (firstAvailable_ > numberSets_ + model->numberRows() + model->factorizationFrequency())
-               returnNumber = 4;
-     }
-     break;
-     // return 1 if there may be changing bounds on variable (column generation)
-     case 6: {
-          returnNumber = (lowerColumn_ != NULL || upperColumn_ != NULL) ? 1 : 0;
-#if 0
-          if (!returnNumber) {
-               // may be gub slacks
-               for (int i = 0; i < numberSets_; i++) {
-                    if (upper_[i] > lower_[i]) {
-                         returnNumber = 1;
-                         break;
-                    }
-               }
-          }
-#endif
-     }
-     break;
-     // restore firstAvailable_
-     case 7: {
-          int iColumn;
-          int * length = matrix_->getMutableVectorLengths();
-          double * cost = model->costRegion();
-          double * solution = model->solutionRegion();
-          int currentNumber = firstAvailable_;
-          firstAvailable_ = savedFirstAvailable_;
-          // zero solution
-          CoinZeroN(solution + firstAvailable_, currentNumber - firstAvailable_);
-          // zero cost
-          CoinZeroN(cost + firstAvailable_, currentNumber - firstAvailable_);
-          // zero lengths
-          CoinZeroN(length + firstAvailable_, currentNumber - firstAvailable_);
-          for ( iColumn = firstAvailable_; iColumn < currentNumber; iColumn++) {
-               model->nonLinearCost()->setOne(iColumn, 0.0, 0.0, COIN_DBL_MAX, 0.0);
-               model->setStatus(iColumn, ClpSimplex::atLowerBound);
-               backward_[iColumn] = -1;
-          }
-     }
-     break;
-     // make sure set is clean
-     case 8: {
-          int sequenceIn = model->sequenceIn();
-          if (sequenceIn < model->numberColumns()) {
-               int iSet = backward_[sequenceIn];
-               if (iSet >= 0 && lowerSet_) {
-                    // we only need to get lower_ and upper_ correct
-                    double shift = 0.0;
-                    for (int j = fullStart_[iSet]; j < fullStart_[iSet+1]; j++)
-                         if (getDynamicStatus(j) == atUpperBound)
-                              shift += upperColumn_[j];
-                         else if (getDynamicStatus(j) == atLowerBound && lowerColumn_)
-                              shift += lowerColumn_[j];
-                    if (lowerSet_[iSet] > -1.0e20)
-                         lower_[iSet] = lowerSet_[iSet] - shift;
-                    if (upperSet_[iSet] < 1.0e20)
-                         upper_[iSet] = upperSet_[iSet] - shift;
-               }
-               if (sequenceIn == firstAvailable_) {
-                    // not really in small problem
-                    int iBig = id_[sequenceIn-firstDynamic_];
-                    if (model->getStatus(sequenceIn) == ClpSimplex::atLowerBound)
-                         setDynamicStatus(iBig, atLowerBound);
-                    else
-                         setDynamicStatus(iBig, atUpperBound);
-               }
-          }
-     }
-     break;
-     // adjust lower,upper
-     case 9: {
-          int sequenceIn = model->sequenceIn();
-          if (sequenceIn >= firstDynamic_ && sequenceIn < lastDynamic_ && lowerSet_) {
-               int iSet = backward_[sequenceIn];
-               assert (iSet >= 0);
-               int inBig = id_[sequenceIn-firstDynamic_];
-               const double * solution = model->solutionRegion();
-               setDynamicStatus(inBig, inSmall);
-               if (lowerSet_[iSet] > -1.0e20)
-                    lower_[iSet] += solution[sequenceIn];
-               if (upperSet_[iSet] < 1.0e20)
-                    upper_[iSet] += solution[sequenceIn];
-               model->setObjectiveOffset(model->objectiveOffset() -
-                                         solution[sequenceIn]*cost_[inBig]);
-          }
-     }
-     }
-     return returnNumber;
-}
-// Add a new variable to a set
-void
-ClpGubDynamicMatrix::insertNonBasic(int sequence, int iSet)
-{
-     int last = keyVariable_[iSet];
-     int j = next_[last];
-     while (j >= 0) {
-          last = j;
-          j = next_[j];
-     }
-     next_[last] = -(sequence + 1);
-     next_[sequence] = j;
-}
-// Sets up an effective RHS and does gub crash if needed
-void
-ClpGubDynamicMatrix::useEffectiveRhs(ClpSimplex * model, bool cheapest)
-{
-     // Do basis - cheapest or slack if feasible (unless cheapest set)
-     int longestSet = 0;
-     int iSet;
-     for (iSet = 0; iSet < numberSets_; iSet++)
-          longestSet = CoinMax(longestSet, fullStart_[iSet+1] - fullStart_[iSet]);
-
-     double * upper = new double[longestSet+1];
-     double * cost = new double[longestSet+1];
-     double * lower = new double[longestSet+1];
-     double * solution = new double[longestSet+1];
-     assert (!next_);
-     delete [] next_;
-     int numberColumns = model->numberColumns();
-     next_ = new int[numberColumns+numberSets_+CoinMax(2*longestSet, lastDynamic_-firstDynamic_)];
-     char * mark = new char[numberColumns];
-     memset(mark, 0, numberColumns);
-     for (int iColumn = 0; iColumn < numberColumns; iColumn++)
-          next_[iColumn] = COIN_INT_MAX;
-     int i;
-     int * keys = new int[numberSets_];
-     int * back = new int[numberGubColumns_];
-     CoinFillN(back, numberGubColumns_, -1);
-     for (i = 0; i < numberSets_; i++)
-          keys[i] = COIN_INT_MAX;
-     delete [] dynamicStatus_;
-     dynamicStatus_ = new unsigned char [numberGubColumns_];
-     memset(dynamicStatus_, 0, numberGubColumns_); // for clarity
-     for (i = 0; i < numberGubColumns_; i++)
-          setDynamicStatus(i, atLowerBound);
-     // set up chains
-     for (i = firstDynamic_; i < lastDynamic_; i++) {
-          if (id_[i-firstDynamic_] >= 0) {
-               if (model->getStatus(i) == ClpSimplex::basic)
-                    mark[i] = 1;
-               int iSet = backward_[i];
-               assert (iSet >= 0);
-               int iNext = keys[iSet];
-               next_[i] = iNext;
-               keys[iSet] = i;
-               back[id_[i-firstDynamic_]] = i;
-          } else {
-               model->setStatus(i, ClpSimplex::atLowerBound);
-               backward_[i] = -1;
-          }
-     }
-     double * columnSolution = model->solutionRegion();
-     int numberRows = getNumRows();
-     toIndex_ = new int[numberSets_];
-     for (iSet = 0; iSet < numberSets_; iSet++)
-          toIndex_[iSet] = -1;
-     fromIndex_ = new int [numberRows+numberSets_];
-     double tolerance = model->primalTolerance();
-     double * element =  matrix_->getMutableElements();
-     int * row = matrix_->getMutableIndices();
-     CoinBigIndex * startColumn = matrix_->getMutableVectorStarts();
-     int * length = matrix_->getMutableVectorLengths();
-     double objectiveOffset = 0.0;
-     for (iSet = 0; iSet < numberSets_; iSet++) {
-          int j;
-          int numberBasic = 0;
-          int iBasic = -1;
-          int iStart = fullStart_[iSet];
-          int iEnd = fullStart_[iSet+1];
-          // find one with smallest length
-          int smallest = numberRows + 1;
-          double value = 0.0;
-          j = keys[iSet];
-          while (j != COIN_INT_MAX) {
-               if (model->getStatus(j) == ClpSimplex::basic) {
-                    if (length[j] < smallest) {
-                         smallest = length[j];
-                         iBasic = j;
-                    }
-                    numberBasic++;
-               }
-               value += columnSolution[j];
-               j = next_[j];
-          }
-          bool done = false;
-          if (numberBasic > 1 || (numberBasic == 1 && getStatus(iSet) == ClpSimplex::basic)) {
-               if (getStatus(iSet) == ClpSimplex::basic)
-                    iBasic = iSet + numberColumns; // slack key - use
-               done = true;
-          } else if (numberBasic == 1) {
-               // see if can be key
-               double thisSolution = columnSolution[iBasic];
-               if (thisSolution < 0.0) {
-                    value -= thisSolution;
-                    thisSolution = 0.0;
-                    columnSolution[iBasic] = thisSolution;
-               }
-               // try setting slack to a bound
-               assert (upper_[iSet] < 1.0e20 || lower_[iSet] > -1.0e20);
-               double cost1 = COIN_DBL_MAX;
-               int whichBound = -1;
-               if (upper_[iSet] < 1.0e20) {
-                    // try slack at ub
-                    double newBasic = thisSolution + upper_[iSet] - value;
-                    if (newBasic >= -tolerance) {
-                         // can go
-                         whichBound = 1;
-                         cost1 = newBasic * cost_[iBasic];
-                         // But if exact then may be good solution
-                         if (fabs(upper_[iSet] - value) < tolerance)
-                              cost1 = -COIN_DBL_MAX;
-                    }
-               }
-               if (lower_[iSet] > -1.0e20) {
-                    // try slack at lb
-                    double newBasic = thisSolution + lower_[iSet] - value;
-                    if (newBasic >= -tolerance) {
-                         // can go but is it cheaper
-                         double cost2 = newBasic * cost_[iBasic];
-                         // But if exact then may be good solution
-                         if (fabs(lower_[iSet] - value) < tolerance)
-                              cost2 = -COIN_DBL_MAX;
-                         if (cost2 < cost1)
-                              whichBound = 0;
-                    }
-               }
-               if (whichBound != -1) {
-                    // key
-                    done = true;
-                    if (whichBound) {
-                         // slack to upper
-                         columnSolution[iBasic] = thisSolution + upper_[iSet] - value;
-                         setStatus(iSet, ClpSimplex::atUpperBound);
-                    } else {
-                         // slack to lower
-                         columnSolution[iBasic] = thisSolution + lower_[iSet] - value;
-                         setStatus(iSet, ClpSimplex::atLowerBound);
-                    }
-               }
-          }
-          if (!done) {
-               if (!cheapest) {
-                    // see if slack can be key
-                    if (value >= lower_[iSet] - tolerance && value <= upper_[iSet] + tolerance) {
-                         done = true;
-                         setStatus(iSet, ClpSimplex::basic);
-                         iBasic = iSet + numberColumns;
-                    }
-               }
-               if (!done) {
-                    // set non basic if there was one
-                    if (iBasic >= 0)
-                         model->setStatus(iBasic, ClpSimplex::atLowerBound);
-                    // find cheapest
-                    int numberInSet = iEnd - iStart;
-                    if (!lowerColumn_) {
-                         CoinZeroN(lower, numberInSet);
-                    } else {
-                         for (int j = 0; j < numberInSet; j++)
-                              lower[j] = lowerColumn_[j+iStart];
-                    }
-                    if (!upperColumn_) {
-                         CoinFillN(upper, numberInSet, COIN_DBL_MAX);
-                    } else {
-                         for (int j = 0; j < numberInSet; j++)
-                              upper[j] = upperColumn_[j+iStart];
-                    }
-                    CoinFillN(solution, numberInSet, 0.0);
-                    // and slack
-                    iBasic = numberInSet;
-                    solution[iBasic] = -value;
-                    lower[iBasic] = -upper_[iSet];
-                    upper[iBasic] = -lower_[iSet];
-                    int kphase;
-                    if (value >= lower_[iSet] - tolerance && value <= upper_[iSet] + tolerance) {
-                         // feasible
-                         kphase = 1;
-                         cost[iBasic] = 0.0;
-                         for (int j = 0; j < numberInSet; j++)
-                              cost[j] = cost_[j+iStart];
-                    } else {
-                         // infeasible
-                         kphase = 0;
-                         // remember bounds are flipped so opposite to natural
-                         if (value < lower_[iSet] - tolerance)
-                              cost[iBasic] = 1.0;
-                         else
-                              cost[iBasic] = -1.0;
-                         CoinZeroN(cost, numberInSet);
-                    }
-                    double dualTolerance = model->dualTolerance();
-                    for (int iphase = kphase; iphase < 2; iphase++) {
-                         if (iphase) {
-                              cost[numberInSet] = 0.0;
-                              for (int j = 0; j < numberInSet; j++)
-                                   cost[j] = cost_[j+iStart];
-                         }
-                         // now do one row lp
-                         bool improve = true;
-                         while (improve) {
-                              improve = false;
-                              double dual = cost[iBasic];
-                              int chosen = -1;
-                              double best = dualTolerance;
-                              int way = 0;
-                              for (int i = 0; i <= numberInSet; i++) {
-                                   double dj = cost[i] - dual;
-                                   double improvement = 0.0;
-                                   if (iphase || i < numberInSet)
-                                        assert (solution[i] >= lower[i] && solution[i] <= upper[i]);
-                                   if (dj > dualTolerance)
-                                        improvement = dj * (solution[i] - lower[i]);
-                                   else if (dj < -dualTolerance)
-                                        improvement = dj * (solution[i] - upper[i]);
-                                   if (improvement > best) {
-                                        best = improvement;
-                                        chosen = i;
-                                        if (dj < 0.0) {
-                                             way = 1;
-                                        } else {
-                                             way = -1;
-                                        }
-                                   }
-                              }
-                              if (chosen >= 0) {
-                                   improve = true;
-                                   // now see how far
-                                   if (way > 0) {
-                                        // incoming increasing so basic decreasing
-                                        // if phase 0 then go to nearest bound
-                                        double distance = upper[chosen] - solution[chosen];
-                                        double basicDistance;
-                                        if (!iphase) {
-                                             assert (iBasic == numberInSet);
-                                             assert (solution[iBasic] > upper[iBasic]);
-                                             basicDistance = solution[iBasic] - upper[iBasic];
-                                        } else {
-                                             basicDistance = solution[iBasic] - lower[iBasic];
-                                        }
-                                        // need extra coding for unbounded
-                                        assert (CoinMin(distance, basicDistance) < 1.0e20);
-                                        if (distance > basicDistance) {
-                                             // incoming becomes basic
-                                             solution[chosen] += basicDistance;
-                                             if (!iphase)
-                                                  solution[iBasic] = upper[iBasic];
-                                             else
-                                                  solution[iBasic] = lower[iBasic];
-                                             iBasic = chosen;
-                                        } else {
-                                             // flip
-                                             solution[chosen] = upper[chosen];
-                                             solution[iBasic] -= distance;
-                                        }
-                                   } else {
-                                        // incoming decreasing so basic increasing
-                                        // if phase 0 then go to nearest bound
-                                        double distance = solution[chosen] - lower[chosen];
-                                        double basicDistance;
-                                        if (!iphase) {
-                                             assert (iBasic == numberInSet);
-                                             assert (solution[iBasic] < lower[iBasic]);
-                                             basicDistance = lower[iBasic] - solution[iBasic];
-                                        } else {
-                                             basicDistance = upper[iBasic] - solution[iBasic];
-                                        }
-                                        // need extra coding for unbounded - for now just exit
-                                        if (CoinMin(distance, basicDistance) > 1.0e20) {
-                                             printf("unbounded on set %d\n", iSet);
-                                             iphase = 1;
-                                             iBasic = numberInSet;
-                                             break;
-                                        }
-                                        if (distance > basicDistance) {
-                                             // incoming becomes basic
-                                             solution[chosen] -= basicDistance;
-                                             if (!iphase)
-                                                  solution[iBasic] = lower[iBasic];
-                                             else
-                                                  solution[iBasic] = upper[iBasic];
-                                             iBasic = chosen;
-                                        } else {
-                                             // flip
-                                             solution[chosen] = lower[chosen];
-                                             solution[iBasic] += distance;
-                                        }
-                                   }
-                                   if (!iphase) {
-                                        if(iBasic < numberInSet)
-                                             break; // feasible
-                                        else if (solution[iBasic] >= lower[iBasic] &&
-                                                  solution[iBasic] <= upper[iBasic])
-                                             break; // feasible (on flip)
-                                   }
-                              }
-                         }
-                    }
-                    // do solution i.e. bounds
-                    if (lowerColumn_ || upperColumn_) {
-                         for (int j = 0; j < numberInSet; j++) {
-                              if (j != iBasic) {
-                                   objectiveOffset += solution[j] * cost[j];
-                                   if (lowerColumn_ && upperColumn_) {
-                                        if (fabs(solution[j] - lowerColumn_[j+iStart]) >
-                                                  fabs(solution[j] - upperColumn_[j+iStart]))
-                                             setDynamicStatus(j + iStart, atUpperBound);
-                                   } else if (upperColumn_ && solution[j] > 0.0) {
-                                        setDynamicStatus(j + iStart, atUpperBound);
-                                   } else {
-                                        setDynamicStatus(j + iStart, atLowerBound);
-                                   }
-                              }
-                         }
-                    }
-                    // convert iBasic back and do bounds
-                    if (iBasic == numberInSet) {
-                         // slack basic
-                         setStatus(iSet, ClpSimplex::basic);
-                         iBasic = iSet + numberColumns;
-                    } else {
-                         iBasic += fullStart_[iSet];
-                         if (back[iBasic] >= 0) {
-                              // exists
-                              iBasic = back[iBasic];
-                         } else {
-                              // create
-                              CoinBigIndex numberElements = startColumn[firstAvailable_];
-                              int numberThis = startColumn_[iBasic+1] - startColumn_[iBasic];
-                              if (numberElements + numberThis > numberElements_) {
-                                   // need to redo
-                                   numberElements_ = CoinMax(3 * numberElements_ / 2, numberElements + numberThis);
-                                   matrix_->reserve(numberColumns, numberElements_);
-                                   element =  matrix_->getMutableElements();
-                                   row = matrix_->getMutableIndices();
-                                   // these probably okay but be safe
-                                   startColumn = matrix_->getMutableVectorStarts();
-                                   length = matrix_->getMutableVectorLengths();
-                              }
-                              length[firstAvailable_] = numberThis;
-                              model->costRegion()[firstAvailable_] = cost_[iBasic];
-                              if (lowerColumn_)
-                                   model->lowerRegion()[firstAvailable_] = lowerColumn_[iBasic];
-                              else
-                                   model->lowerRegion()[firstAvailable_] = 0.0;
-                              if (upperColumn_)
-                                   model->upperRegion()[firstAvailable_] = upperColumn_[iBasic];
-                              else
-                                   model->upperRegion()[firstAvailable_] = COIN_DBL_MAX;
-                              columnSolution[firstAvailable_] = solution[iBasic-fullStart_[iSet]];
-                              CoinBigIndex base = startColumn_[iBasic];
-                              for (int j = 0; j < numberThis; j++) {
-                                   row[numberElements] = row_[base+j];
-                                   element[numberElements++] = element_[base+j];
-                              }
-                              // already set startColumn[firstAvailable_]=numberElements;
-                              id_[firstAvailable_-firstDynamic_] = iBasic;
-                              setDynamicStatus(iBasic, inSmall);
-                              backward_[firstAvailable_] = iSet;
-                              iBasic = firstAvailable_;
-                              firstAvailable_++;
-                              startColumn[firstAvailable_] = numberElements;
-                         }
-                         model->setStatus(iBasic, ClpSimplex::basic);
-                         // remember bounds flipped
-                         if (upper[numberInSet] == lower[numberInSet])
-                              setStatus(iSet, ClpSimplex::isFixed);
-                         else if (solution[numberInSet] == upper[numberInSet])
-                              setStatus(iSet, ClpSimplex::atLowerBound);
-                         else if (solution[numberInSet] == lower[numberInSet])
-                              setStatus(iSet, ClpSimplex::atUpperBound);
-                         else
-                              abort();
-                    }
-                    for (j = iStart; j < iEnd; j++) {
-                         int iBack = back[j];
-                         if (iBack >= 0) {
-                              if (model->getStatus(iBack) != ClpSimplex::basic) {
-                                   int inSet = j - iStart;
-                                   columnSolution[iBack] = solution[inSet];
-                                   if (upper[inSet] == lower[inSet])
-                                        model->setStatus(iBack, ClpSimplex::isFixed);
-                                   else if (solution[inSet] == upper[inSet])
-                                        model->setStatus(iBack, ClpSimplex::atUpperBound);
-                                   else if (solution[inSet] == lower[inSet])
-                                        model->setStatus(iBack, ClpSimplex::atLowerBound);
-                              }
-                         }
-                    }
-               }
-          }
-          keyVariable_[iSet] = iBasic;
-     }
-     model->setObjectiveOffset(objectiveOffset_ - objectiveOffset);
-     delete [] lower;
-     delete [] solution;
-     delete [] upper;
-     delete [] cost;
-     // make sure matrix is in good shape
-     matrix_->orderMatrix();
-     // create effective rhs
-     delete [] rhsOffset_;
-     rhsOffset_ = new double[numberRows];
-     // and redo chains
-     memset(mark, 0, numberColumns);
-     for (int iColumnX = 0; iColumnX < firstAvailable_; iColumnX++)
-          next_[iColumnX] = COIN_INT_MAX;
-     for (i = 0; i < numberSets_; i++) {
-          keys[i] = COIN_INT_MAX;
-          int iKey = keyVariable_[i];
-          if (iKey < numberColumns)
-               model->setStatus(iKey, ClpSimplex::basic);
-     }
-     // set up chains
-     for (i = 0; i < firstAvailable_; i++) {
-          if (model->getStatus(i) == ClpSimplex::basic)
-               mark[i] = 1;
-          int iSet = backward_[i];
-          if (iSet >= 0) {
-               int iNext = keys[iSet];
-               next_[i] = iNext;
-               keys[iSet] = i;
-          }
-     }
-     for (i = 0; i < numberSets_; i++) {
-          if (keys[i] != COIN_INT_MAX) {
-               // something in set
-               int j;
-               if (getStatus(i) != ClpSimplex::basic) {
-                    // make sure fixed if it is
-                    if (upper_[i] == lower_[i])
-                         setStatus(i, ClpSimplex::isFixed);
-                    // slack not key - choose one with smallest length
-                    int smallest = numberRows + 1;
-                    int key = -1;
-                    j = keys[i];
-                    while (1) {
-                         if (mark[j] && length[j] < smallest) {
-                              key = j;
-                              smallest = length[j];
-                         }
-                         if (next_[j] != COIN_INT_MAX) {
-                              j = next_[j];
-                         } else {
-                              // correct end
-                              next_[j] = -(keys[i] + 1);
-                              break;
-                         }
-                    }
-                    if (key >= 0) {
-                         keyVariable_[i] = key;
-                    } else {
-                         // nothing basic - make slack key
-                         //((ClpGubMatrix *)this)->setStatus(i,ClpSimplex::basic);
-                         // fudge to avoid const problem
-                         status_[i] = 1;
-                    }
-               } else {
-                    // slack key
-                    keyVariable_[i] = numberColumns + i;
-                    int j;
-                    double sol = 0.0;
-                    j = keys[i];
-                    while (1) {
-                         sol += columnSolution[j];
-                         if (next_[j] != COIN_INT_MAX) {
-                              j = next_[j];
-                         } else {
-                              // correct end
-                              next_[j] = -(keys[i] + 1);
-                              break;
-                         }
-                    }
-                    if (sol > upper_[i] + tolerance) {
-                         setAbove(i);
-                    } else if (sol < lower_[i] - tolerance) {
-                         setBelow(i);
-                    } else {
-                         setFeasible(i);
-                    }
-               }
-               // Create next_
-               int key = keyVariable_[i];
-               redoSet(model, key, keys[i], i);
-          } else {
-               // nothing in set!
-               next_[i+numberColumns] = -(i + numberColumns + 1);
-               keyVariable_[i] = numberColumns + i;
-               double sol = 0.0;
-               if (sol > upper_[i] + tolerance) {
-                    setAbove(i);
-               } else if (sol < lower_[i] - tolerance) {
-                    setBelow(i);
-               } else {
-                    setFeasible(i);
-               }
-          }
-     }
-     delete [] keys;
-     delete [] mark;
-     delete [] back;
-     rhsOffset(model, true);
-}
-/* Returns effective RHS if it is being used.  This is used for long problems
-   or big gub or anywhere where going through full columns is
-   expensive.  This may re-compute */
-double *
-ClpGubDynamicMatrix::rhsOffset(ClpSimplex * model, bool forceRefresh,
-                               bool
-#ifdef CLP_DEBUG
-                               check
-#endif
-                              )
-{
-     //forceRefresh=true;
-     //check=false;
-#ifdef CLP_DEBUG
-     double * saveE = NULL;
-     if (rhsOffset_ && check) {
-          int numberRows = model->numberRows();
-          saveE = new double[numberRows];
-     }
-#endif
-     if (rhsOffset_) {
-#ifdef CLP_DEBUG
-          if (check) {
-               // no need - but check anyway
-               int numberRows = model->numberRows();
-               double * rhs = new double[numberRows];
-               int numberColumns = model->numberColumns();
-               int iRow;
-               CoinZeroN(rhs, numberRows);
-               // do ones at bounds before gub
-               const double * smallSolution = model->solutionRegion();
-               const double * element = matrix_->getElements();
-               const int * row = matrix_->getIndices();
-               const CoinBigIndex * startColumn = matrix_->getVectorStarts();
-               const int * length = matrix_->getVectorLengths();
-               int iColumn;
-               for (iColumn = 0; iColumn < firstDynamic_; iColumn++) {
-                    if (model->getStatus(iColumn) != ClpSimplex::basic) {
-                         double value = smallSolution[iColumn];
-                         for (CoinBigIndex j = startColumn[iColumn];
-                                   j < startColumn[iColumn] + length[iColumn]; j++) {
-                              int jRow = row[j];
-                              rhs[jRow] -= value * element[j];
-                         }
-                    }
-               }
-               if (lowerColumn_ || upperColumn_) {
-                    double * solution = new double [numberGubColumns_];
-                    for (iColumn = 0; iColumn < numberGubColumns_; iColumn++) {
-                         double value = 0.0;
-                         if(getDynamicStatus(iColumn) == atUpperBound)
-                              value = upperColumn_[iColumn];
-                         else if (lowerColumn_)
-                              value = lowerColumn_[iColumn];
-                         solution[iColumn] = value;
-                    }
-                    // ones at bounds in small and gub
-                    for (iColumn = firstDynamic_; iColumn < firstAvailable_; iColumn++) {
-                         int jFull = id_[iColumn-firstDynamic_];
-                         solution[jFull] = smallSolution[iColumn];
-                    }
-                    // zero all basic in small model
-                    int * pivotVariable = model->pivotVariable();
-                    for (iRow = 0; iRow < numberRows; iRow++) {
-                         int iColumn = pivotVariable[iRow];
-                         if (iColumn >= firstDynamic_ && iColumn < lastDynamic_) {
-                              int iSequence = id_[iColumn-firstDynamic_];
-                              solution[iSequence] = 0.0;
-                         }
-                    }
-                    // and now compute value to use for key
-                    ClpSimplex::Status iStatus;
-                    for (int iSet = 0; iSet < numberSets_; iSet++) {
-                         iColumn = keyVariable_[iSet];
-                         if (iColumn < numberColumns) {
-                              int iSequence = id_[iColumn-firstDynamic_];
-                              solution[iSequence] = 0.0;
-                              double b = 0.0;
-                              // key is structural - where is slack
-                              iStatus = getStatus(iSet);
-                              assert (iStatus != ClpSimplex::basic);
-                              if (iStatus == ClpSimplex::atLowerBound)
-                                   b = lowerSet_[iSet];
-                              else
-                                   b = upperSet_[iSet];
-                              // subtract out others at bounds
-                              for (int j = fullStart_[iSet]; j < fullStart_[iSet+1]; j++)
-                                   b -= solution[j];
-                              solution[iSequence] = b;
-                         }
-                    }
-                    for (iColumn = 0; iColumn < numberGubColumns_; iColumn++) {
-                         double value = solution[iColumn];
-                         if (value) {
-                              for (CoinBigIndex j = startColumn_[iColumn]; j < startColumn_[iColumn+1]; j++) {
-                                   int iRow = row_[j];
-                                   rhs[iRow] -= element_[j] * value;
-                              }
-                         }
-                    }
-                    // now do lower and upper bounds on sets
-                    for (int iSet = 0; iSet < numberSets_; iSet++) {
-                         iColumn = keyVariable_[iSet];
-                         double shift = 0.0;
-                         for (int j = fullStart_[iSet]; j < fullStart_[iSet+1]; j++) {
-                              if (getDynamicStatus(j) != inSmall && j != iColumn) {
-                                   if (getDynamicStatus(j) == atLowerBound) {
-                                        if (lowerColumn_)
-                                             shift += lowerColumn_[j];
-                                   } else {
-                                        shift += upperColumn_[j];
-                                   }
-                              }
-                         }
-                         if (lowerSet_[iSet] > -1.0e20)
-                              assert(fabs(lower_[iSet] - (lowerSet_[iSet] - shift)) < 1.0e-3);
-                         if (upperSet_[iSet] < 1.0e20)
-                              assert(fabs(upper_[iSet] - ( upperSet_[iSet] - shift)) < 1.0e-3);
-                    }
-                    delete [] solution;
-               } else {
-                    // no bounds
-                    ClpSimplex::Status iStatus;
-                    for (int iSet = 0; iSet < numberSets_; iSet++) {
-                         int iColumn = keyVariable_[iSet];
-                         if (iColumn < numberColumns) {
-                              int iSequence = id_[iColumn-firstDynamic_];
-                              double b = 0.0;
-                              // key is structural - where is slack
-                              iStatus = getStatus(iSet);
-                              assert (iStatus != ClpSimplex::basic);
-                              if (iStatus == ClpSimplex::atLowerBound)
-                                   b = lower_[iSet];
-                              else
-                                   b = upper_[iSet];
-                              if (b) {
-                                   for (CoinBigIndex j = startColumn_[iSequence]; j < startColumn_[iSequence+1]; j++) {
-                                        int iRow = row_[j];
-                                        rhs[iRow] -= element_[j] * b;
-                                   }
-                              }
-                         }
-                    }
-               }
-               for (iRow = 0; iRow < numberRows; iRow++) {
-                    if (fabs(rhs[iRow] - rhsOffset_[iRow]) > 1.0e-3)
-                         printf("** bad effective %d - true %g old %g\n", iRow, rhs[iRow], rhsOffset_[iRow]);
-               }
-               CoinMemcpyN(rhs, numberRows, saveE);
-               delete [] rhs;
-          }
-#endif
-          if (forceRefresh || (refreshFrequency_ && model->numberIterations() >=
-                               lastRefresh_ + refreshFrequency_)) {
-               int numberRows = model->numberRows();
-               int numberColumns = model->numberColumns();
-               int iRow;
-               CoinZeroN(rhsOffset_, numberRows);
-               // do ones at bounds before gub
-               const double * smallSolution = model->solutionRegion();
-               const double * element = matrix_->getElements();
-               const int * row = matrix_->getIndices();
-               const CoinBigIndex * startColumn = matrix_->getVectorStarts();
-               const int * length = matrix_->getVectorLengths();
-               int iColumn;
-               for (iColumn = 0; iColumn < firstDynamic_; iColumn++) {
-                    if (model->getStatus(iColumn) != ClpSimplex::basic) {
-                         double value = smallSolution[iColumn];
-                         for (CoinBigIndex j = startColumn[iColumn];
-                                   j < startColumn[iColumn] + length[iColumn]; j++) {
-                              int jRow = row[j];
-                              rhsOffset_[jRow] -= value * element[j];
-                         }
-                    }
-               }
-               if (lowerColumn_ || upperColumn_) {
-                    double * solution = new double [numberGubColumns_];
-                    for (iColumn = 0; iColumn < numberGubColumns_; iColumn++) {
-                         double value = 0.0;
-                         if(getDynamicStatus(iColumn) == atUpperBound)
-                              value = upperColumn_[iColumn];
-                         else if (lowerColumn_)
-                              value = lowerColumn_[iColumn];
-                         solution[iColumn] = value;
-                    }
-                    // ones in gub and in small problem
-                    for (iColumn = firstDynamic_; iColumn < firstAvailable_; iColumn++) {
-                         int jFull = id_[iColumn-firstDynamic_];
-                         solution[jFull] = smallSolution[iColumn];
-                    }
-                    // zero all basic in small model
-                    int * pivotVariable = model->pivotVariable();
-                    for (iRow = 0; iRow < numberRows; iRow++) {
-                         int iColumn = pivotVariable[iRow];
-                         if (iColumn >= firstDynamic_ && iColumn < lastDynamic_) {
-                              int iSequence = id_[iColumn-firstDynamic_];
-                              solution[iSequence] = 0.0;
-                         }
-                    }
-                    // and now compute value to use for key
-                    ClpSimplex::Status iStatus;
-                    int iSet;
-                    for ( iSet = 0; iSet < numberSets_; iSet++) {
-                         iColumn = keyVariable_[iSet];
-                         if (iColumn < numberColumns) {
-                              int iSequence = id_[iColumn-firstDynamic_];
-                              solution[iSequence] = 0.0;
-                              double b = 0.0;
-                              // key is structural - where is slack
-                              iStatus = getStatus(iSet);
-                              assert (iStatus != ClpSimplex::basic);
-                              if (iStatus == ClpSimplex::atLowerBound)
-                                   b = lowerSet_[iSet];
-                              else
-                                   b = upperSet_[iSet];
-                              // subtract out others at bounds
-                              for (int j = fullStart_[iSet]; j < fullStart_[iSet+1]; j++)
-                                   b -= solution[j];
-                              solution[iSequence] = b;
-                         }
-                    }
-                    for (iColumn = 0; iColumn < numberGubColumns_; iColumn++) {
-                         double value = solution[iColumn];
-                         if (value) {
-                              for (CoinBigIndex j = startColumn_[iColumn]; j < startColumn_[iColumn+1]; j++) {
-                                   int iRow = row_[j];
-                                   rhsOffset_[iRow] -= element_[j] * value;
-                              }
-                         }
-                    }
-                    // now do lower and upper bounds on sets
-                    // and offset
-                    double objectiveOffset = 0.0;
-                    for ( iSet = 0; iSet < numberSets_; iSet++) {
-                         iColumn = keyVariable_[iSet];
-                         double shift = 0.0;
-                         for (CoinBigIndex j = fullStart_[iSet]; j < fullStart_[iSet+1]; j++) {
-                              if (getDynamicStatus(j) != inSmall) {
-                                   double value = 0.0;
-                                   if (getDynamicStatus(j) == atLowerBound) {
-                                        if (lowerColumn_)
-                                             value = lowerColumn_[j];
-                                   } else {
-                                        value = upperColumn_[j];
-                                   }
-                                   if (j != iColumn)
-                                        shift += value;
-                                   objectiveOffset += value * cost_[j];
-                              }
-                         }
-                         if (lowerSet_[iSet] > -1.0e20)
-                              lower_[iSet] = lowerSet_[iSet] - shift;
-                         if (upperSet_[iSet] < 1.0e20)
-                              upper_[iSet] = upperSet_[iSet] - shift;
-                    }
-                    delete [] solution;
-                    model->setObjectiveOffset(objectiveOffset_ - objectiveOffset);
-               } else {
-                    // no bounds
-                    ClpSimplex::Status iStatus;
-                    for (int iSet = 0; iSet < numberSets_; iSet++) {
-                         int iColumn = keyVariable_[iSet];
-                         if (iColumn < numberColumns) {
-                              int iSequence = id_[iColumn-firstDynamic_];
-                              double b = 0.0;
-                              // key is structural - where is slack
-                              iStatus = getStatus(iSet);
-                              assert (iStatus != ClpSimplex::basic);
-                              if (iStatus == ClpSimplex::atLowerBound)
-                                   b = lower_[iSet];
-                              else
-                                   b = upper_[iSet];
-                              if (b) {
-                                   for (CoinBigIndex j = startColumn_[iSequence]; j < startColumn_[iSequence+1]; j++) {
-                                        int iRow = row_[j];
-                                        rhsOffset_[iRow] -= element_[j] * b;
-                                   }
-                              }
-                         }
-                    }
-               }
-#ifdef CLP_DEBUG
-               if (saveE) {
-                    for (iRow = 0; iRow < numberRows; iRow++) {
-                         if (fabs(saveE[iRow] - rhsOffset_[iRow]) > 1.0e-3)
-                              printf("** %d - old eff %g new %g\n", iRow, saveE[iRow], rhsOffset_[iRow]);
-                    }
-                    delete [] saveE;
-               }
-#endif
-               lastRefresh_ = model->numberIterations();
-          }
-     }
-     return rhsOffset_;
-}
-/*
-  update information for a pivot (and effective rhs)
-*/
-int
-ClpGubDynamicMatrix::updatePivot(ClpSimplex * model, double oldInValue, double oldOutValue)
-{
-
-     // now update working model
-     int sequenceIn = model->sequenceIn();
-     int sequenceOut = model->sequenceOut();
-     bool doPrinting = (model->messageHandler()->logLevel() == 63);
-     bool print = false;
-     int iSet;
-     int trueIn = -1;
-     int trueOut = -1;
-     int numberRows = model->numberRows();
-     int numberColumns = model->numberColumns();
-     if (sequenceIn == firstAvailable_) {
-          if (doPrinting)
-               printf("New variable ");
-          if (sequenceIn != sequenceOut) {
-               insertNonBasic(firstAvailable_, backward_[firstAvailable_]);
-               setDynamicStatus(id_[sequenceIn-firstDynamic_], inSmall);
-               firstAvailable_++;
-          } else {
-               int bigSequence = id_[sequenceIn-firstDynamic_];
-               if (model->getStatus(sequenceIn) == ClpSimplex::atUpperBound)
-                    setDynamicStatus(bigSequence, atUpperBound);
-               else
-                    setDynamicStatus(bigSequence, atLowerBound);
-          }
-          synchronize(model, 8);
-     }
-     if (sequenceIn < lastDynamic_) {
-          iSet = backward_[sequenceIn];
-          if (iSet >= 0) {
-               int bigSequence = id_[sequenceIn-firstDynamic_];
-               trueIn = bigSequence + numberRows + numberColumns + numberSets_;
-               if (doPrinting)
-                    printf(" incoming set %d big seq %d", iSet, bigSequence);
-               print = true;
-          }
-     } else if (sequenceIn >= numberRows + numberColumns) {
-          trueIn = numberRows + numberColumns + gubSlackIn_;
-     }
-     if (sequenceOut < lastDynamic_) {
-          iSet = backward_[sequenceOut];
-          if (iSet >= 0) {
-               int bigSequence = id_[sequenceOut-firstDynamic_];
-               trueOut = bigSequence + firstDynamic_;
-               if (getDynamicStatus(bigSequence) != inSmall) {
-                    if (model->getStatus(sequenceOut) == ClpSimplex::atUpperBound)
-                         setDynamicStatus(bigSequence, atUpperBound);
-                    else
-                         setDynamicStatus(bigSequence, atLowerBound);
-               }
-               if (doPrinting)
-                    printf(" ,outgoing set %d big seq %d,", iSet, bigSequence);
-               print = true;
-               model->setSequenceIn(sequenceOut);
-               synchronize(model, 8);
-               model->setSequenceIn(sequenceIn);
-          }
-     }
-     if (print && doPrinting)
-          printf("\n");
-     ClpGubMatrix::updatePivot(model, oldInValue, oldOutValue);
-     // Redo true in and out
-     if (trueIn >= 0)
-          trueSequenceIn_ = trueIn;
-     if (trueOut >= 0)
-          trueSequenceOut_ = trueOut;
-     if (doPrinting && 0) {
-          for (int i = 0; i < numberSets_; i++) {
-               printf("set %d key %d lower %g upper %g\n", i, keyVariable_[i], lower_[i], upper_[i]);
-               for (int j = fullStart_[i]; j < fullStart_[i+1]; j++)
-                    if (getDynamicStatus(j) == atUpperBound) {
-                         bool print = true;
-                         for (int k = firstDynamic_; k < firstAvailable_; k++) {
-                              if (id_[k-firstDynamic_] == j)
-                                   print = false;
-                              if (id_[k-firstDynamic_] == j)
-                                   assert(getDynamicStatus(j) == inSmall);
-                         }
-                         if (print)
-                              printf("variable %d at ub\n", j);
-                    }
-          }
-     }
-#ifdef CLP_DEBUG
-     char * inSmall = new char [numberGubColumns_];
-     memset(inSmall, 0, numberGubColumns_);
-     for (int i = 0; i < numberGubColumns_; i++)
-          if (getDynamicStatus(i) == ClpGubDynamicMatrix::inSmall)
-               inSmall[i] = 1;
-     for (int i = firstDynamic_; i < firstAvailable_; i++) {
-          int k = id_[i-firstDynamic_];
-          inSmall[k] = 0;
-     }
-     for (int i = 0; i < numberGubColumns_; i++)
-          assert (!inSmall[i]);
-     delete [] inSmall;
-#endif
-     return 0;
-}
-void
-ClpGubDynamicMatrix::times(double scalar,
-                           const double * x, double * y) const
-{
-     if (model_->specialOptions() != 16) {
-          ClpPackedMatrix::times(scalar, x, y);
-     } else {
-          int iRow;
-          int numberColumns = model_->numberColumns();
-          int numberRows = model_->numberRows();
-          const double * element =  matrix_->getElements();
-          const int * row = matrix_->getIndices();
-          const CoinBigIndex * startColumn = matrix_->getVectorStarts();
-          const int * length = matrix_->getVectorLengths();
-          int * pivotVariable = model_->pivotVariable();
-          int numberToDo = 0;
-          for (iRow = 0; iRow < numberRows; iRow++) {
-               y[iRow] -= scalar * rhsOffset_[iRow];
-               int iColumn = pivotVariable[iRow];
-               if (iColumn < numberColumns) {
-                    int iSet = backward_[iColumn];
-                    if (iSet >= 0 && toIndex_[iSet] < 0) {
-                         toIndex_[iSet] = 0;
-                         fromIndex_[numberToDo++] = iSet;
-                    }
-                    CoinBigIndex j;
-                    double value = scalar * x[iColumn];
-                    if (value) {
-                         for (j = startColumn[iColumn];
-                                   j < startColumn[iColumn] + length[iColumn]; j++) {
-                              int jRow = row[j];
-                              y[jRow] += value * element[j];
-                         }
-                    }
-               }
-          }
-          // and gubs which are interacting
-          for (int jSet = 0; jSet < numberToDo; jSet++) {
-               int iSet = fromIndex_[jSet];
-               toIndex_[iSet] = -1;
-               int iKey = keyVariable_[iSet];
-               if (iKey < numberColumns) {
-                    double valueKey;
-                    if (getStatus(iSet) == ClpSimplex::atLowerBound)
-                         valueKey = lower_[iSet];
-                    else
-                         valueKey = upper_[iSet];
-                    double value = scalar * (x[iKey] - valueKey);
-                    if (value) {
-                         for (CoinBigIndex j = startColumn[iKey];
-                                   j < startColumn[iKey] + length[iKey]; j++) {
-                              int jRow = row[j];
-                              y[jRow] += value * element[j];
-                         }
-                    }
-               }
-          }
-     }
-}
-/* Just for debug - may be extended to other matrix types later.
-   Returns number and sum of primal infeasibilities.
-*/
-int
-ClpGubDynamicMatrix::checkFeasible(ClpSimplex * /*model*/, double & sum) const
-{
-     int numberRows = model_->numberRows();
-     double * rhs = new double[numberRows];
-     int numberColumns = model_->numberColumns();
-     int iRow;
-     CoinZeroN(rhs, numberRows);
-     // do ones at bounds before gub
-     const double * smallSolution = model_->solutionRegion();
-     const double * element = matrix_->getElements();
-     const int * row = matrix_->getIndices();
-     const CoinBigIndex * startColumn = matrix_->getVectorStarts();
-     const int * length = matrix_->getVectorLengths();
-     int iColumn;
-     int numberInfeasible = 0;
-     const double * rowLower = model_->rowLower();
-     const double * rowUpper = model_->rowUpper();
-     sum = 0.0;
-     for (iRow = 0; iRow < numberRows; iRow++) {
-          double value = smallSolution[numberColumns+iRow];
-          if (value < rowLower[iRow] - 1.0e-5 ||
-                    value > rowUpper[iRow] + 1.0e-5) {
-               //printf("row %d %g %g %g\n",
-               //     iRow,rowLower[iRow],value,rowUpper[iRow]);
-               numberInfeasible++;
-               sum += CoinMax(rowLower[iRow] - value, value - rowUpper[iRow]);
-          }
-          rhs[iRow] = value;
-     }
-     const double * columnLower = model_->columnLower();
-     const double * columnUpper = model_->columnUpper();
-     for (iColumn = 0; iColumn < firstDynamic_; iColumn++) {
-          double value = smallSolution[iColumn];
-          if (value < columnLower[iColumn] - 1.0e-5 ||
-                    value > columnUpper[iColumn] + 1.0e-5) {
-               //printf("column %d %g %g %g\n",
-               //     iColumn,columnLower[iColumn],value,columnUpper[iColumn]);
-               numberInfeasible++;
-               sum += CoinMax(columnLower[iColumn] - value, value - columnUpper[iColumn]);
-          }
-          for (CoinBigIndex j = startColumn[iColumn];
-                    j < startColumn[iColumn] + length[iColumn]; j++) {
-               int jRow = row[j];
-               rhs[jRow] -= value * element[j];
-          }
-     }
-     double * solution = new double [numberGubColumns_];
-     for (iColumn = 0; iColumn < numberGubColumns_; iColumn++) {
-          double value = 0.0;
-          if(getDynamicStatus(iColumn) == atUpperBound)
-               value = upperColumn_[iColumn];
-          else if (lowerColumn_)
-               value = lowerColumn_[iColumn];
-          solution[iColumn] = value;
-     }
-     // ones in small and gub
-     for (iColumn = firstDynamic_; iColumn < firstAvailable_; iColumn++) {
-          int jFull = id_[iColumn-firstDynamic_];
-          solution[jFull] = smallSolution[iColumn];
-     }
-     // fill in all basic in small model
-     int * pivotVariable = model_->pivotVariable();
-     for (iRow = 0; iRow < numberRows; iRow++) {
-          int iColumn = pivotVariable[iRow];
-          if (iColumn >= firstDynamic_ && iColumn < lastDynamic_) {
-               int iSequence = id_[iColumn-firstDynamic_];
-               solution[iSequence] = smallSolution[iColumn];
-          }
-     }
-     // and now compute value to use for key
-     ClpSimplex::Status iStatus;
-     for (int iSet = 0; iSet < numberSets_; iSet++) {
-          iColumn = keyVariable_[iSet];
-          if (iColumn < numberColumns) {
-               int iSequence = id_[iColumn-firstDynamic_];
-               solution[iSequence] = 0.0;
-               double b = 0.0;
-               // key is structural - where is slack
-               iStatus = getStatus(iSet);
-               assert (iStatus != ClpSimplex::basic);
-               if (iStatus == ClpSimplex::atLowerBound)
-                    b = lower_[iSet];
-               else
-                    b = upper_[iSet];
-               // subtract out others at bounds
-               for (int j = fullStart_[iSet]; j < fullStart_[iSet+1]; j++)
-                    b -= solution[j];
-               solution[iSequence] = b;
-          }
-     }
-     for (iColumn = 0; iColumn < numberGubColumns_; iColumn++) {
-          double value = solution[iColumn];
-          if ((lowerColumn_ && value < lowerColumn_[iColumn] - 1.0e-5) ||
-                    (!lowerColumn_ && value < -1.0e-5) ||
-                    (upperColumn_ && value > upperColumn_[iColumn] + 1.0e-5)) {
-               //printf("column %d %g %g %g\n",
-               //     iColumn,lowerColumn_[iColumn],value,upperColumn_[iColumn]);
-               numberInfeasible++;
-          }
-          if (value) {
-               for (CoinBigIndex j = startColumn_[iColumn]; j < startColumn_[iColumn+1]; j++) {
-                    int iRow = row_[j];
-                    rhs[iRow] -= element_[j] * value;
-               }
-          }
-     }
-     for (iRow = 0; iRow < numberRows; iRow++) {
-          if (fabs(rhs[iRow]) > 1.0e-5)
-               printf("rhs mismatch %d %g\n", iRow, rhs[iRow]);
-     }
-     delete [] solution;
-     delete [] rhs;
-     return numberInfeasible;
-}
-// Cleans data after setWarmStart
-void
-ClpGubDynamicMatrix::cleanData(ClpSimplex * model)
-{
-     // and redo chains
-     int numberColumns = model->numberColumns();
-     int iColumn;
-     // do backward
-     int * mark = new int [numberGubColumns_];
-     for (iColumn = 0; iColumn < numberGubColumns_; iColumn++)
-          mark[iColumn] = -1;
-     int i;
-     for (i = 0; i < firstDynamic_; i++) {
-          assert (backward_[i] == -1);
-          next_[i] = -1;
-     }
-     for (i = firstDynamic_; i < firstAvailable_; i++) {
-          iColumn = id_[i-firstDynamic_];
-          mark[iColumn] = i;
-     }
-     for (i = 0; i < numberSets_; i++) {
-          int iKey = keyVariable_[i];
-          int lastNext = -1;
-          int firstNext = -1;
-          for (CoinBigIndex k = fullStart_[i]; k < fullStart_[i+1]; k++) {
-               iColumn = mark[k];
-               if (iColumn >= 0) {
-                    if (iColumn != iKey) {
-                         if (lastNext >= 0)
-                              next_[lastNext] = iColumn;
-                         else
-                              firstNext = iColumn;
-                         lastNext = iColumn;
-                    }
-                    backward_[iColumn] = i;
-               }
-          }
-          setFeasible(i);
-          if (firstNext >= 0) {
-               // others
-               next_[iKey] = firstNext;
-               next_[lastNext] = -(iKey + 1);
-          } else if (iKey < numberColumns) {
-               next_[iKey] = -(iKey + 1);
-          }
-     }
-     delete [] mark;
-     // fill matrix
-     double * element =  matrix_->getMutableElements();
-     int * row = matrix_->getMutableIndices();
-     CoinBigIndex * startColumn = matrix_->getMutableVectorStarts();
-     int * length = matrix_->getMutableVectorLengths();
-     CoinBigIndex numberElements = startColumn[firstDynamic_];
-     for (i = firstDynamic_; i < firstAvailable_; i++) {
-          int iColumn = id_[i-firstDynamic_];
-          int numberThis = startColumn_[iColumn+1] - startColumn_[iColumn];
-          length[i] = numberThis;
-          for (CoinBigIndex jBigIndex = startColumn_[iColumn];
-                    jBigIndex < startColumn_[iColumn+1]; jBigIndex++) {
-               row[numberElements] = row_[jBigIndex];
-               element[numberElements++] = element_[jBigIndex];
-          }
-          startColumn[i+1] = numberElements;
-     }
-}
diff --git a/cbits/coin/ClpGubMatrix.cpp b/cbits/coin/ClpGubMatrix.cpp
deleted file mode 100644
--- a/cbits/coin/ClpGubMatrix.cpp
+++ /dev/null
@@ -1,4061 +0,0 @@
-/* $Id: ClpGubMatrix.cpp 1931 2013-04-06 20:44:29Z stefan $ */
-// Copyright (C) 2002, International Business Machines
-// Corporation and others.  All Rights Reserved.
-// This code is licensed under the terms of the Eclipse Public License (EPL).
-
-
-#include <cstdio>
-
-#include "CoinPragma.hpp"
-#include "CoinIndexedVector.hpp"
-#include "CoinHelperFunctions.hpp"
-
-#include "ClpSimplex.hpp"
-#include "ClpFactorization.hpp"
-#include "ClpQuadraticObjective.hpp"
-#include "ClpNonLinearCost.hpp"
-// at end to get min/max!
-#include "ClpGubMatrix.hpp"
-//#include "ClpGubDynamicMatrix.hpp"
-#include "ClpMessage.hpp"
-//#define CLP_DEBUG
-//#define CLP_DEBUG_PRINT
-//#############################################################################
-// Constructors / Destructor / Assignment
-//#############################################################################
-
-//-------------------------------------------------------------------
-// Default Constructor
-//-------------------------------------------------------------------
-ClpGubMatrix::ClpGubMatrix ()
-     : ClpPackedMatrix(),
-       sumDualInfeasibilities_(0.0),
-       sumPrimalInfeasibilities_(0.0),
-       sumOfRelaxedDualInfeasibilities_(0.0),
-       sumOfRelaxedPrimalInfeasibilities_(0.0),
-       infeasibilityWeight_(0.0),
-       start_(NULL),
-       end_(NULL),
-       lower_(NULL),
-       upper_(NULL),
-       status_(NULL),
-       saveStatus_(NULL),
-       savedKeyVariable_(NULL),
-       backward_(NULL),
-       backToPivotRow_(NULL),
-       changeCost_(NULL),
-       keyVariable_(NULL),
-       next_(NULL),
-       toIndex_(NULL),
-       fromIndex_(NULL),
-       model_(NULL),
-       numberDualInfeasibilities_(0),
-       numberPrimalInfeasibilities_(0),
-       noCheck_(-1),
-       numberSets_(0),
-       saveNumber_(0),
-       possiblePivotKey_(0),
-       gubSlackIn_(-1),
-       firstGub_(0),
-       lastGub_(0),
-       gubType_(0)
-{
-     setType(16);
-}
-
-//-------------------------------------------------------------------
-// Copy constructor
-//-------------------------------------------------------------------
-ClpGubMatrix::ClpGubMatrix (const ClpGubMatrix & rhs)
-     : ClpPackedMatrix(rhs)
-{
-     numberSets_ = rhs.numberSets_;
-     saveNumber_ = rhs.saveNumber_;
-     possiblePivotKey_ = rhs.possiblePivotKey_;
-     gubSlackIn_ = rhs.gubSlackIn_;
-     start_ = ClpCopyOfArray(rhs.start_, numberSets_);
-     end_ = ClpCopyOfArray(rhs.end_, numberSets_);
-     lower_ = ClpCopyOfArray(rhs.lower_, numberSets_);
-     upper_ = ClpCopyOfArray(rhs.upper_, numberSets_);
-     status_ = ClpCopyOfArray(rhs.status_, numberSets_);
-     saveStatus_ = ClpCopyOfArray(rhs.saveStatus_, numberSets_);
-     savedKeyVariable_ = ClpCopyOfArray(rhs.savedKeyVariable_, numberSets_);
-     int numberColumns = getNumCols();
-     backward_ = ClpCopyOfArray(rhs.backward_, numberColumns);
-     backToPivotRow_ = ClpCopyOfArray(rhs.backToPivotRow_, numberColumns);
-     changeCost_ = ClpCopyOfArray(rhs.changeCost_, getNumRows() + numberSets_);
-     fromIndex_ = ClpCopyOfArray(rhs.fromIndex_, getNumRows() + numberSets_ + 1);
-     keyVariable_ = ClpCopyOfArray(rhs.keyVariable_, numberSets_);
-     // find longest set
-     int * longest = new int[numberSets_];
-     CoinZeroN(longest, numberSets_);
-     int j;
-     for (j = 0; j < numberColumns; j++) {
-          int iSet = backward_[j];
-          if (iSet >= 0)
-               longest[iSet]++;
-     }
-     int length = 0;
-     for (j = 0; j < numberSets_; j++)
-          length = CoinMax(length, longest[j]);
-     next_ = ClpCopyOfArray(rhs.next_, numberColumns + numberSets_ + 2 * length);
-     toIndex_ = ClpCopyOfArray(rhs.toIndex_, numberSets_);
-     sumDualInfeasibilities_ = rhs. sumDualInfeasibilities_;
-     sumPrimalInfeasibilities_ = rhs.sumPrimalInfeasibilities_;
-     sumOfRelaxedDualInfeasibilities_ = rhs.sumOfRelaxedDualInfeasibilities_;
-     sumOfRelaxedPrimalInfeasibilities_ = rhs.sumOfRelaxedPrimalInfeasibilities_;
-     infeasibilityWeight_ = rhs.infeasibilityWeight_;
-     numberDualInfeasibilities_ = rhs.numberDualInfeasibilities_;
-     numberPrimalInfeasibilities_ = rhs.numberPrimalInfeasibilities_;
-     noCheck_ = rhs.noCheck_;
-     firstGub_ = rhs.firstGub_;
-     lastGub_ = rhs.lastGub_;
-     gubType_ = rhs.gubType_;
-     model_ = rhs.model_;
-}
-
-//-------------------------------------------------------------------
-// assign matrix (for space reasons)
-//-------------------------------------------------------------------
-ClpGubMatrix::ClpGubMatrix (CoinPackedMatrix * rhs)
-     : ClpPackedMatrix(rhs),
-       sumDualInfeasibilities_(0.0),
-       sumPrimalInfeasibilities_(0.0),
-       sumOfRelaxedDualInfeasibilities_(0.0),
-       sumOfRelaxedPrimalInfeasibilities_(0.0),
-       infeasibilityWeight_(0.0),
-       start_(NULL),
-       end_(NULL),
-       lower_(NULL),
-       upper_(NULL),
-       status_(NULL),
-       saveStatus_(NULL),
-       savedKeyVariable_(NULL),
-       backward_(NULL),
-       backToPivotRow_(NULL),
-       changeCost_(NULL),
-       keyVariable_(NULL),
-       next_(NULL),
-       toIndex_(NULL),
-       fromIndex_(NULL),
-       model_(NULL),
-       numberDualInfeasibilities_(0),
-       numberPrimalInfeasibilities_(0),
-       noCheck_(-1),
-       numberSets_(0),
-       saveNumber_(0),
-       possiblePivotKey_(0),
-       gubSlackIn_(-1),
-       firstGub_(0),
-       lastGub_(0),
-       gubType_(0)
-{
-     setType(16);
-}
-
-/* This takes over ownership (for space reasons) and is the
-   real constructor*/
-ClpGubMatrix::ClpGubMatrix(ClpPackedMatrix * matrix, int numberSets,
-                           const int * start, const int * end,
-                           const double * lower, const double * upper,
-                           const unsigned char * status)
-     : ClpPackedMatrix(matrix->matrix()),
-       sumDualInfeasibilities_(0.0),
-       sumPrimalInfeasibilities_(0.0),
-       sumOfRelaxedDualInfeasibilities_(0.0),
-       sumOfRelaxedPrimalInfeasibilities_(0.0),
-       numberDualInfeasibilities_(0),
-       numberPrimalInfeasibilities_(0),
-       saveNumber_(0),
-       possiblePivotKey_(0),
-       gubSlackIn_(-1)
-{
-     model_ = NULL;
-     numberSets_ = numberSets;
-     start_ = ClpCopyOfArray(start, numberSets_);
-     end_ = ClpCopyOfArray(end, numberSets_);
-     lower_ = ClpCopyOfArray(lower, numberSets_);
-     upper_ = ClpCopyOfArray(upper, numberSets_);
-     // Check valid and ordered
-     int last = -1;
-     int numberColumns = matrix_->getNumCols();
-     int numberRows = matrix_->getNumRows();
-     backward_ = new int[numberColumns];
-     backToPivotRow_ = new int[numberColumns];
-     changeCost_ = new double [numberRows+numberSets_];
-     keyVariable_ = new int[numberSets_];
-     // signal to need new ordering
-     next_ = NULL;
-     for (int iColumn = 0; iColumn < numberColumns; iColumn++)
-          backward_[iColumn] = -1;
-
-     int iSet;
-     for (iSet = 0; iSet < numberSets_; iSet++) {
-          // set key variable as slack
-          keyVariable_[iSet] = iSet + numberColumns;
-          if (start_[iSet] < 0 || start_[iSet] >= numberColumns)
-               throw CoinError("Index out of range", "constructor", "ClpGubMatrix");
-          if (end_[iSet] < 0 || end_[iSet] > numberColumns)
-               throw CoinError("Index out of range", "constructor", "ClpGubMatrix");
-          if (end_[iSet] <= start_[iSet])
-               throw CoinError("Empty or negative set", "constructor", "ClpGubMatrix");
-          if (start_[iSet] < last)
-               throw CoinError("overlapping or non-monotonic sets", "constructor", "ClpGubMatrix");
-          last = end_[iSet];
-          int j;
-          for (j = start_[iSet]; j < end_[iSet]; j++)
-               backward_[j] = iSet;
-     }
-     // Find type of gub
-     firstGub_ = numberColumns + 1;
-     lastGub_ = -1;
-     int i;
-     for (i = 0; i < numberColumns; i++) {
-          if (backward_[i] >= 0) {
-               firstGub_ = CoinMin(firstGub_, i);
-               lastGub_ = CoinMax(lastGub_, i);
-          }
-     }
-     gubType_ = 0;
-     // adjust lastGub_
-     if (lastGub_ > 0)
-          lastGub_++;
-     for (i = firstGub_; i < lastGub_; i++) {
-          if (backward_[i] < 0) {
-               gubType_ = 1;
-               printf("interior non gub %d\n", i);
-               break;
-          }
-     }
-     if (status) {
-          status_ = ClpCopyOfArray(status, numberSets_);
-     } else {
-          status_ = new unsigned char [numberSets_];
-          memset(status_, 0, numberSets_);
-          int i;
-          for (i = 0; i < numberSets_; i++) {
-               // make slack key
-               setStatus(i, ClpSimplex::basic);
-          }
-     }
-     saveStatus_ = new unsigned char [numberSets_];
-     memset(saveStatus_, 0, numberSets_);
-     savedKeyVariable_ = new int [numberSets_];
-     memset(savedKeyVariable_, 0, numberSets_ * sizeof(int));
-     noCheck_ = -1;
-     infeasibilityWeight_ = 0.0;
-}
-
-ClpGubMatrix::ClpGubMatrix (const CoinPackedMatrix & rhs)
-     : ClpPackedMatrix(rhs),
-       sumDualInfeasibilities_(0.0),
-       sumPrimalInfeasibilities_(0.0),
-       sumOfRelaxedDualInfeasibilities_(0.0),
-       sumOfRelaxedPrimalInfeasibilities_(0.0),
-       infeasibilityWeight_(0.0),
-       start_(NULL),
-       end_(NULL),
-       lower_(NULL),
-       upper_(NULL),
-       status_(NULL),
-       saveStatus_(NULL),
-       savedKeyVariable_(NULL),
-       backward_(NULL),
-       backToPivotRow_(NULL),
-       changeCost_(NULL),
-       keyVariable_(NULL),
-       next_(NULL),
-       toIndex_(NULL),
-       fromIndex_(NULL),
-       model_(NULL),
-       numberDualInfeasibilities_(0),
-       numberPrimalInfeasibilities_(0),
-       noCheck_(-1),
-       numberSets_(0),
-       saveNumber_(0),
-       possiblePivotKey_(0),
-       gubSlackIn_(-1),
-       firstGub_(0),
-       lastGub_(0),
-       gubType_(0)
-{
-     setType(16);
-
-}
-
-//-------------------------------------------------------------------
-// Destructor
-//-------------------------------------------------------------------
-ClpGubMatrix::~ClpGubMatrix ()
-{
-     delete [] start_;
-     delete [] end_;
-     delete [] lower_;
-     delete [] upper_;
-     delete [] status_;
-     delete [] saveStatus_;
-     delete [] savedKeyVariable_;
-     delete [] backward_;
-     delete [] backToPivotRow_;
-     delete [] changeCost_;
-     delete [] keyVariable_;
-     delete [] next_;
-     delete [] toIndex_;
-     delete [] fromIndex_;
-}
-
-//----------------------------------------------------------------
-// Assignment operator
-//-------------------------------------------------------------------
-ClpGubMatrix &
-ClpGubMatrix::operator=(const ClpGubMatrix& rhs)
-{
-     if (this != &rhs) {
-          ClpPackedMatrix::operator=(rhs);
-          delete [] start_;
-          delete [] end_;
-          delete [] lower_;
-          delete [] upper_;
-          delete [] status_;
-          delete [] saveStatus_;
-          delete [] savedKeyVariable_;
-          delete [] backward_;
-          delete [] backToPivotRow_;
-          delete [] changeCost_;
-          delete [] keyVariable_;
-          delete [] next_;
-          delete [] toIndex_;
-          delete [] fromIndex_;
-          numberSets_ = rhs.numberSets_;
-          saveNumber_ = rhs.saveNumber_;
-          possiblePivotKey_ = rhs.possiblePivotKey_;
-          gubSlackIn_ = rhs.gubSlackIn_;
-          start_ = ClpCopyOfArray(rhs.start_, numberSets_);
-          end_ = ClpCopyOfArray(rhs.end_, numberSets_);
-          lower_ = ClpCopyOfArray(rhs.lower_, numberSets_);
-          upper_ = ClpCopyOfArray(rhs.upper_, numberSets_);
-          status_ = ClpCopyOfArray(rhs.status_, numberSets_);
-          saveStatus_ = ClpCopyOfArray(rhs.saveStatus_, numberSets_);
-          savedKeyVariable_ = ClpCopyOfArray(rhs.savedKeyVariable_, numberSets_);
-          int numberColumns = getNumCols();
-          backward_ = ClpCopyOfArray(rhs.backward_, numberColumns);
-          backToPivotRow_ = ClpCopyOfArray(rhs.backToPivotRow_, numberColumns);
-          changeCost_ = ClpCopyOfArray(rhs.changeCost_, getNumRows() + numberSets_);
-          fromIndex_ = ClpCopyOfArray(rhs.fromIndex_, getNumRows() + numberSets_ + 1);
-          keyVariable_ = ClpCopyOfArray(rhs.keyVariable_, numberSets_);
-          // find longest set
-          int * longest = new int[numberSets_];
-          CoinZeroN(longest, numberSets_);
-          int j;
-          for (j = 0; j < numberColumns; j++) {
-               int iSet = backward_[j];
-               if (iSet >= 0)
-                    longest[iSet]++;
-          }
-          int length = 0;
-          for (j = 0; j < numberSets_; j++)
-               length = CoinMax(length, longest[j]);
-          next_ = ClpCopyOfArray(rhs.next_, numberColumns + numberSets_ + 2 * length);
-          toIndex_ = ClpCopyOfArray(rhs.toIndex_, numberSets_);
-          sumDualInfeasibilities_ = rhs. sumDualInfeasibilities_;
-          sumPrimalInfeasibilities_ = rhs.sumPrimalInfeasibilities_;
-          sumOfRelaxedDualInfeasibilities_ = rhs.sumOfRelaxedDualInfeasibilities_;
-          sumOfRelaxedPrimalInfeasibilities_ = rhs.sumOfRelaxedPrimalInfeasibilities_;
-          infeasibilityWeight_ = rhs.infeasibilityWeight_;
-          numberDualInfeasibilities_ = rhs.numberDualInfeasibilities_;
-          numberPrimalInfeasibilities_ = rhs.numberPrimalInfeasibilities_;
-          noCheck_ = rhs.noCheck_;
-          firstGub_ = rhs.firstGub_;
-          lastGub_ = rhs.lastGub_;
-          gubType_ = rhs.gubType_;
-          model_ = rhs.model_;
-     }
-     return *this;
-}
-//-------------------------------------------------------------------
-// Clone
-//-------------------------------------------------------------------
-ClpMatrixBase * ClpGubMatrix::clone() const
-{
-     return new ClpGubMatrix(*this);
-}
-/* Subset clone (without gaps).  Duplicates are allowed
-   and order is as given */
-ClpMatrixBase *
-ClpGubMatrix::subsetClone (int numberRows, const int * whichRows,
-                           int numberColumns,
-                           const int * whichColumns) const
-{
-     return new ClpGubMatrix(*this, numberRows, whichRows,
-                             numberColumns, whichColumns);
-}
-/* Returns a new matrix in reverse order without gaps
-   Is allowed to return NULL if doesn't want to have row copy */
-ClpMatrixBase *
-ClpGubMatrix::reverseOrderedCopy() const
-{
-     return NULL;
-}
-int
-ClpGubMatrix::hiddenRows() const
-{
-     return numberSets_;
-}
-/* Subset constructor (without gaps).  Duplicates are allowed
-   and order is as given */
-ClpGubMatrix::ClpGubMatrix (
-     const ClpGubMatrix & rhs,
-     int numberRows, const int * whichRows,
-     int numberColumns, const int * whichColumns)
-     : ClpPackedMatrix(rhs, numberRows, whichRows, numberColumns, whichColumns)
-{
-     // Assuming no gub rows deleted
-     // We also assume all sets in same order
-     // Get array with backward pointers
-     int numberColumnsOld = rhs.matrix_->getNumCols();
-     int * array = new int [ numberColumnsOld];
-     int i;
-     for (i = 0; i < numberColumnsOld; i++)
-          array[i] = -1;
-     for (int iSet = 0; iSet < numberSets_; iSet++) {
-          for (int j = start_[iSet]; j < end_[iSet]; j++)
-               array[j] = iSet;
-     }
-     numberSets_ = -1;
-     int lastSet = -1;
-     bool inSet = false;
-     for (i = 0; i < numberColumns; i++) {
-          int iColumn = whichColumns[i];
-          int iSet = array[iColumn];
-          if (iSet < 0) {
-               inSet = false;
-          } else {
-               if (!inSet) {
-                    // start of new set but check okay
-                    if (iSet <= lastSet)
-                         throw CoinError("overlapping or non-monotonic sets", "subset constructor", "ClpGubMatrix");
-                    lastSet = iSet;
-                    numberSets_++;
-                    start_[numberSets_] = i;
-                    end_[numberSets_] = i + 1;
-                    lower_[numberSets_] = lower_[iSet];
-                    upper_[numberSets_] = upper_[iSet];
-                    inSet = true;
-               } else {
-                    if (iSet < lastSet) {
-                         throw CoinError("overlapping or non-monotonic sets", "subset constructor", "ClpGubMatrix");
-                    } else if (iSet == lastSet) {
-                         end_[numberSets_] = i + 1;
-                    } else {
-                         // new set
-                         lastSet = iSet;
-                         numberSets_++;
-                         start_[numberSets_] = i;
-                         end_[numberSets_] = i + 1;
-                         lower_[numberSets_] = lower_[iSet];
-                         upper_[numberSets_] = upper_[iSet];
-                    }
-               }
-          }
-     }
-     delete [] array;
-     numberSets_++; // adjust
-     // Find type of gub
-     firstGub_ = numberColumns + 1;
-     lastGub_ = -1;
-     for (i = 0; i < numberColumns; i++) {
-          if (backward_[i] >= 0) {
-               firstGub_ = CoinMin(firstGub_, i);
-               lastGub_ = CoinMax(lastGub_, i);
-          }
-     }
-     if (lastGub_ > 0)
-          lastGub_++;
-     gubType_ = 0;
-     for (i = firstGub_; i < lastGub_; i++) {
-          if (backward_[i] < 0) {
-               gubType_ = 1;
-               break;
-          }
-     }
-
-     // Make sure key is feasible if only key in set
-}
-ClpGubMatrix::ClpGubMatrix (
-     const CoinPackedMatrix & rhs,
-     int numberRows, const int * whichRows,
-     int numberColumns, const int * whichColumns)
-     : ClpPackedMatrix(rhs, numberRows, whichRows, numberColumns, whichColumns),
-       sumDualInfeasibilities_(0.0),
-       sumPrimalInfeasibilities_(0.0),
-       sumOfRelaxedDualInfeasibilities_(0.0),
-       sumOfRelaxedPrimalInfeasibilities_(0.0),
-       start_(NULL),
-       end_(NULL),
-       lower_(NULL),
-       upper_(NULL),
-       backward_(NULL),
-       backToPivotRow_(NULL),
-       changeCost_(NULL),
-       keyVariable_(NULL),
-       next_(NULL),
-       toIndex_(NULL),
-       fromIndex_(NULL),
-       numberDualInfeasibilities_(0),
-       numberPrimalInfeasibilities_(0),
-       numberSets_(0),
-       saveNumber_(0),
-       possiblePivotKey_(0),
-       gubSlackIn_(-1),
-       firstGub_(0),
-       lastGub_(0),
-       gubType_(0)
-{
-     setType(16);
-}
-/* Return <code>x * A + y</code> in <code>z</code>.
-	Squashes small elements and knows about ClpSimplex */
-void
-ClpGubMatrix::transposeTimes(const ClpSimplex * model, double scalar,
-                             const CoinIndexedVector * rowArray,
-                             CoinIndexedVector * y,
-                             CoinIndexedVector * columnArray) const
-{
-     columnArray->clear();
-     double * pi = rowArray->denseVector();
-     int numberNonZero = 0;
-     int * index = columnArray->getIndices();
-     double * array = columnArray->denseVector();
-     int numberInRowArray = rowArray->getNumElements();
-     // maybe I need one in OsiSimplex
-     double zeroTolerance = model->zeroTolerance();
-     int numberRows = model->numberRows();
-     ClpPackedMatrix* rowCopy =
-          dynamic_cast< ClpPackedMatrix*>(model->rowCopy());
-     bool packed = rowArray->packedMode();
-     double factor = 0.3;
-     // We may not want to do by row if there may be cache problems
-     int numberColumns = model->numberColumns();
-     // It would be nice to find L2 cache size - for moment 512K
-     // Be slightly optimistic
-     if (numberColumns * sizeof(double) > 1000000) {
-          if (numberRows * 10 < numberColumns)
-               factor = 0.1;
-          else if (numberRows * 4 < numberColumns)
-               factor = 0.15;
-          else if (numberRows * 2 < numberColumns)
-               factor = 0.2;
-          //if (model->numberIterations()%50==0)
-          //printf("%d nonzero\n",numberInRowArray);
-     }
-     // reduce for gub
-     factor *= 0.5;
-     assert (!y->getNumElements());
-     if (numberInRowArray > factor * numberRows || !rowCopy) {
-          // do by column
-          int iColumn;
-          // get matrix data pointers
-          const int * row = matrix_->getIndices();
-          const CoinBigIndex * columnStart = matrix_->getVectorStarts();
-          const int * columnLength = matrix_->getVectorLengths();
-          const double * elementByColumn = matrix_->getElements();
-          const double * rowScale = model->rowScale();
-          int numberColumns = model->numberColumns();
-          int iSet = -1;
-          double djMod = 0.0;
-          if (packed) {
-               // need to expand pi into y
-               assert(y->capacity() >= numberRows);
-               double * piOld = pi;
-               pi = y->denseVector();
-               const int * whichRow = rowArray->getIndices();
-               int i;
-               if (!rowScale) {
-                    // modify pi so can collapse to one loop
-                    for (i = 0; i < numberInRowArray; i++) {
-                         int iRow = whichRow[i];
-                         pi[iRow] = scalar * piOld[i];
-                    }
-                    for (iColumn = 0; iColumn < numberColumns; iColumn++) {
-                         if (backward_[iColumn] != iSet) {
-                              // get pi on gub row
-                              iSet = backward_[iColumn];
-                              if (iSet >= 0) {
-                                   int iBasic = keyVariable_[iSet];
-                                   if (iBasic < numberColumns) {
-                                        // get dj without
-                                        assert (model->getStatus(iBasic) == ClpSimplex::basic);
-                                        djMod = 0.0;
-                                        for (CoinBigIndex j = columnStart[iBasic];
-                                                  j < columnStart[iBasic] + columnLength[iBasic]; j++) {
-                                             int jRow = row[j];
-                                             djMod -= pi[jRow] * elementByColumn[j];
-                                        }
-                                   } else {
-                                        djMod = 0.0;
-                                   }
-                              } else {
-                                   djMod = 0.0;
-                              }
-                         }
-                         double value = -djMod;
-                         CoinBigIndex j;
-                         for (j = columnStart[iColumn];
-                                   j < columnStart[iColumn] + columnLength[iColumn]; j++) {
-                              int iRow = row[j];
-                              value += pi[iRow] * elementByColumn[j];
-                         }
-                         if (fabs(value) > zeroTolerance) {
-                              array[numberNonZero] = value;
-                              index[numberNonZero++] = iColumn;
-                         }
-                    }
-               } else {
-                    // scaled
-                    // modify pi so can collapse to one loop
-                    for (i = 0; i < numberInRowArray; i++) {
-                         int iRow = whichRow[i];
-                         pi[iRow] = scalar * piOld[i] * rowScale[iRow];
-                    }
-                    for (iColumn = 0; iColumn < numberColumns; iColumn++) {
-                         if (backward_[iColumn] != iSet) {
-                              // get pi on gub row
-                              iSet = backward_[iColumn];
-                              if (iSet >= 0) {
-                                   int iBasic = keyVariable_[iSet];
-                                   if (iBasic < numberColumns) {
-                                        // get dj without
-                                        assert (model->getStatus(iBasic) == ClpSimplex::basic);
-                                        djMod = 0.0;
-                                        // scaled
-                                        for (CoinBigIndex j = columnStart[iBasic];
-                                                  j < columnStart[iBasic] + columnLength[iBasic]; j++) {
-                                             int jRow = row[j];
-                                             djMod -= pi[jRow] * elementByColumn[j] * rowScale[jRow];
-                                        }
-                                   } else {
-                                        djMod = 0.0;
-                                   }
-                              } else {
-                                   djMod = 0.0;
-                              }
-                         }
-                         double value = -djMod;
-                         CoinBigIndex j;
-                         const double * columnScale = model->columnScale();
-                         for (j = columnStart[iColumn];
-                                   j < columnStart[iColumn] + columnLength[iColumn]; j++) {
-                              int iRow = row[j];
-                              value += pi[iRow] * elementByColumn[j];
-                         }
-                         value *= columnScale[iColumn];
-                         if (fabs(value) > zeroTolerance) {
-                              array[numberNonZero] = value;
-                              index[numberNonZero++] = iColumn;
-                         }
-                    }
-               }
-               // zero out
-               for (i = 0; i < numberInRowArray; i++) {
-                    int iRow = whichRow[i];
-                    pi[iRow] = 0.0;
-               }
-          } else {
-               // code later
-               assert (packed);
-               if (!rowScale) {
-                    if (scalar == -1.0) {
-                         for (iColumn = 0; iColumn < numberColumns; iColumn++) {
-                              double value = 0.0;
-                              CoinBigIndex j;
-                              for (j = columnStart[iColumn];
-                                        j < columnStart[iColumn] + columnLength[iColumn]; j++) {
-                                   int iRow = row[j];
-                                   value += pi[iRow] * elementByColumn[j];
-                              }
-                              if (fabs(value) > zeroTolerance) {
-                                   index[numberNonZero++] = iColumn;
-                                   array[iColumn] = -value;
-                              }
-                         }
-                    } else if (scalar == 1.0) {
-                         for (iColumn = 0; iColumn < numberColumns; iColumn++) {
-                              double value = 0.0;
-                              CoinBigIndex j;
-                              for (j = columnStart[iColumn];
-                                        j < columnStart[iColumn] + columnLength[iColumn]; j++) {
-                                   int iRow = row[j];
-                                   value += pi[iRow] * elementByColumn[j];
-                              }
-                              if (fabs(value) > zeroTolerance) {
-                                   index[numberNonZero++] = iColumn;
-                                   array[iColumn] = value;
-                              }
-                         }
-                    } else {
-                         for (iColumn = 0; iColumn < numberColumns; iColumn++) {
-                              double value = 0.0;
-                              CoinBigIndex j;
-                              for (j = columnStart[iColumn];
-                                        j < columnStart[iColumn] + columnLength[iColumn]; j++) {
-                                   int iRow = row[j];
-                                   value += pi[iRow] * elementByColumn[j];
-                              }
-                              value *= scalar;
-                              if (fabs(value) > zeroTolerance) {
-                                   index[numberNonZero++] = iColumn;
-                                   array[iColumn] = value;
-                              }
-                         }
-                    }
-               } else {
-                    // scaled
-                    if (scalar == -1.0) {
-                         for (iColumn = 0; iColumn < numberColumns; iColumn++) {
-                              double value = 0.0;
-                              CoinBigIndex j;
-                              const double * columnScale = model->columnScale();
-                              for (j = columnStart[iColumn];
-                                        j < columnStart[iColumn] + columnLength[iColumn]; j++) {
-                                   int iRow = row[j];
-                                   value += pi[iRow] * elementByColumn[j] * rowScale[iRow];
-                              }
-                              value *= columnScale[iColumn];
-                              if (fabs(value) > zeroTolerance) {
-                                   index[numberNonZero++] = iColumn;
-                                   array[iColumn] = -value;
-                              }
-                         }
-                    } else if (scalar == 1.0) {
-                         for (iColumn = 0; iColumn < numberColumns; iColumn++) {
-                              double value = 0.0;
-                              CoinBigIndex j;
-                              const double * columnScale = model->columnScale();
-                              for (j = columnStart[iColumn];
-                                        j < columnStart[iColumn] + columnLength[iColumn]; j++) {
-                                   int iRow = row[j];
-                                   value += pi[iRow] * elementByColumn[j] * rowScale[iRow];
-                              }
-                              value *= columnScale[iColumn];
-                              if (fabs(value) > zeroTolerance) {
-                                   index[numberNonZero++] = iColumn;
-                                   array[iColumn] = value;
-                              }
-                         }
-                    } else {
-                         for (iColumn = 0; iColumn < numberColumns; iColumn++) {
-                              double value = 0.0;
-                              CoinBigIndex j;
-                              const double * columnScale = model->columnScale();
-                              for (j = columnStart[iColumn];
-                                        j < columnStart[iColumn] + columnLength[iColumn]; j++) {
-                                   int iRow = row[j];
-                                   value += pi[iRow] * elementByColumn[j] * rowScale[iRow];
-                              }
-                              value *= scalar * columnScale[iColumn];
-                              if (fabs(value) > zeroTolerance) {
-                                   index[numberNonZero++] = iColumn;
-                                   array[iColumn] = value;
-                              }
-                         }
-                    }
-               }
-          }
-          columnArray->setNumElements(numberNonZero);
-          y->setNumElements(0);
-     } else {
-          // do by row
-          transposeTimesByRow(model, scalar, rowArray, y, columnArray);
-     }
-     if (packed)
-          columnArray->setPackedMode(true);
-     if (0) {
-          columnArray->checkClean();
-          int numberNonZero = columnArray->getNumElements();;
-          int * index = columnArray->getIndices();
-          double * array = columnArray->denseVector();
-          int i;
-          for (i = 0; i < numberNonZero; i++) {
-               int j = index[i];
-               double value;
-               if (packed)
-                    value = array[i];
-               else
-                    value = array[j];
-               printf("Ti %d %d %g\n", i, j, value);
-          }
-     }
-}
-/* Return <code>x * A + y</code> in <code>z</code>.
-	Squashes small elements and knows about ClpSimplex */
-void
-ClpGubMatrix::transposeTimesByRow(const ClpSimplex * model, double scalar,
-                                  const CoinIndexedVector * rowArray,
-                                  CoinIndexedVector * y,
-                                  CoinIndexedVector * columnArray) const
-{
-     // Do packed part
-     ClpPackedMatrix::transposeTimesByRow(model, scalar, rowArray, y, columnArray);
-     if (numberSets_) {
-          /* what we need to do is do by row as normal but get list of sets touched
-             and then update those ones */
-          abort();
-     }
-}
-/* Return <code>x *A in <code>z</code> but
-   just for indices in y. */
-void
-ClpGubMatrix::subsetTransposeTimes(const ClpSimplex * model,
-                                   const CoinIndexedVector * rowArray,
-                                   const CoinIndexedVector * y,
-                                   CoinIndexedVector * columnArray) const
-{
-     columnArray->clear();
-     double * pi = rowArray->denseVector();
-     double * array = columnArray->denseVector();
-     int jColumn;
-     // get matrix data pointers
-     const int * row = matrix_->getIndices();
-     const CoinBigIndex * columnStart = matrix_->getVectorStarts();
-     const int * columnLength = matrix_->getVectorLengths();
-     const double * elementByColumn = matrix_->getElements();
-     const double * rowScale = model->rowScale();
-     int numberToDo = y->getNumElements();
-     const int * which = y->getIndices();
-     assert (!rowArray->packedMode());
-     columnArray->setPacked();
-     int numberTouched = 0;
-     if (!rowScale) {
-          for (jColumn = 0; jColumn < numberToDo; jColumn++) {
-               int iColumn = which[jColumn];
-               double value = 0.0;
-               CoinBigIndex j;
-               for (j = columnStart[iColumn];
-                         j < columnStart[iColumn] + columnLength[iColumn]; j++) {
-                    int iRow = row[j];
-                    value += pi[iRow] * elementByColumn[j];
-               }
-               array[jColumn] = value;
-               if (value) {
-                    int iSet = backward_[iColumn];
-                    if (iSet >= 0) {
-                         int iBasic = keyVariable_[iSet];
-                         if (iBasic == iColumn) {
-                              toIndex_[iSet] = jColumn;
-                              fromIndex_[numberTouched++] = iSet;
-                         }
-                    }
-               }
-          }
-     } else {
-          // scaled
-          for (jColumn = 0; jColumn < numberToDo; jColumn++) {
-               int iColumn = which[jColumn];
-               double value = 0.0;
-               CoinBigIndex j;
-               const double * columnScale = model->columnScale();
-               for (j = columnStart[iColumn];
-                         j < columnStart[iColumn] + columnLength[iColumn]; j++) {
-                    int iRow = row[j];
-                    value += pi[iRow] * elementByColumn[j] * rowScale[iRow];
-               }
-               value *= columnScale[iColumn];
-               array[jColumn] = value;
-               if (value) {
-                    int iSet = backward_[iColumn];
-                    if (iSet >= 0) {
-                         int iBasic = keyVariable_[iSet];
-                         if (iBasic == iColumn) {
-                              toIndex_[iSet] = jColumn;
-                              fromIndex_[numberTouched++] = iSet;
-                         }
-                    }
-               }
-          }
-     }
-     // adjust djs
-     for (jColumn = 0; jColumn < numberToDo; jColumn++) {
-          int iColumn = which[jColumn];
-          int iSet = backward_[iColumn];
-          if (iSet >= 0) {
-               int kColumn = toIndex_[iSet];
-               if (kColumn >= 0)
-                    array[jColumn] -= array[kColumn];
-          }
-     }
-     // and clear basic
-     for (int j = 0; j < numberTouched; j++) {
-          int iSet = fromIndex_[j];
-          int kColumn = toIndex_[iSet];
-          toIndex_[iSet] = -1;
-          array[kColumn] = 0.0;
-     }
-}
-/// returns number of elements in column part of basis,
-CoinBigIndex
-ClpGubMatrix::countBasis(const int * whichColumn,
-                         int & numberColumnBasic)
-{
-     int i;
-     int numberColumns = getNumCols();
-     const int * columnLength = matrix_->getVectorLengths();
-     int numberRows = getNumRows();
-     int numberBasic = 0;
-     CoinBigIndex numberElements = 0;
-     int lastSet = -1;
-     int key = -1;
-     int keyLength = -1;
-     double * work = new double[numberRows];
-     CoinZeroN(work, numberRows);
-     char * mark = new char[numberRows];
-     CoinZeroN(mark, numberRows);
-     const CoinBigIndex * columnStart = matrix_->getVectorStarts();
-     const int * row = matrix_->getIndices();
-     const double * elementByColumn = matrix_->getElements();
-     //ClpGubDynamicMatrix* gubx =
-     //dynamic_cast< ClpGubDynamicMatrix*>(this);
-     //int * id = gubx->id();
-     // just count
-     for (i = 0; i < numberColumnBasic; i++) {
-          int iColumn = whichColumn[i];
-          int iSet = backward_[iColumn];
-          int length = columnLength[iColumn];
-          if (iSet < 0 || keyVariable_[iSet] >= numberColumns) {
-               numberElements += length;
-               numberBasic++;
-               //printf("non gub - set %d id %d (column %d) nel %d\n",iSet,id[iColumn-20],iColumn,length);
-          } else {
-               // in gub set
-               if (iColumn != keyVariable_[iSet]) {
-                    numberBasic++;
-                    CoinBigIndex j;
-                    // not key
-                    if (lastSet < iSet) {
-                         // erase work
-                         if (key >= 0) {
-                              for (j = columnStart[key]; j < columnStart[key] + keyLength; j++)
-                                   work[row[j]] = 0.0;
-                         }
-                         key = keyVariable_[iSet];
-                         lastSet = iSet;
-                         keyLength = columnLength[key];
-                         for (j = columnStart[key]; j < columnStart[key] + keyLength; j++)
-                              work[row[j]] = elementByColumn[j];
-                    }
-                    int extra = keyLength;
-                    for (j = columnStart[iColumn]; j < columnStart[iColumn] + length; j++) {
-                         int iRow = row[j];
-                         double keyValue = work[iRow];
-                         double value = elementByColumn[j];
-                         if (!keyValue) {
-                              if (fabs(value) > 1.0e-20)
-                                   extra++;
-                         } else {
-                              value -= keyValue;
-                              if (fabs(value) <= 1.0e-20)
-                                   extra--;
-                         }
-                    }
-                    numberElements += extra;
-                    //printf("gub - set %d id %d (column %d) nel %d\n",iSet,id[iColumn-20],iColumn,extra);
-               }
-          }
-     }
-     delete [] work;
-     delete [] mark;
-     // update number of column basic
-     numberColumnBasic = numberBasic;
-     return numberElements;
-}
-void
-ClpGubMatrix::fillBasis(ClpSimplex * model,
-                        const int * whichColumn,
-                        int & numberColumnBasic,
-                        int * indexRowU, int * start,
-                        int * rowCount, int * columnCount,
-                        CoinFactorizationDouble * elementU)
-{
-     int i;
-     int numberColumns = getNumCols();
-     const int * columnLength = matrix_->getVectorLengths();
-     int numberRows = getNumRows();
-     assert (next_ || !elementU) ;
-     CoinBigIndex numberElements = start[0];
-     int lastSet = -1;
-     int key = -1;
-     int keyLength = -1;
-     double * work = new double[numberRows];
-     CoinZeroN(work, numberRows);
-     char * mark = new char[numberRows];
-     CoinZeroN(mark, numberRows);
-     const CoinBigIndex * columnStart = matrix_->getVectorStarts();
-     const int * row = matrix_->getIndices();
-     const double * elementByColumn = matrix_->getElements();
-     const double * rowScale = model->rowScale();
-     int numberBasic = 0;
-     if (0) {
-          printf("%d basiccolumns\n", numberColumnBasic);
-          int i;
-          for (i = 0; i < numberSets_; i++) {
-               int k = keyVariable_[i];
-               if (k < numberColumns) {
-                    printf("key %d on set %d, %d elements\n", k, i, columnStart[k+1] - columnStart[k]);
-                    for (int j = columnStart[k]; j < columnStart[k+1]; j++)
-                         printf("row %d el %g\n", row[j], elementByColumn[j]);
-               } else {
-                    printf("slack key on set %d\n", i);
-               }
-          }
-     }
-     // fill
-     if (!rowScale) {
-          // no scaling
-          for (i = 0; i < numberColumnBasic; i++) {
-               int iColumn = whichColumn[i];
-               int iSet = backward_[iColumn];
-               int length = columnLength[iColumn];
-               if (0) {
-                    int k = iColumn;
-                    printf("column %d in set %d, %d elements\n", k, iSet, columnStart[k+1] - columnStart[k]);
-                    for (int j = columnStart[k]; j < columnStart[k+1]; j++)
-                         printf("row %d el %g\n", row[j], elementByColumn[j]);
-               }
-               CoinBigIndex j;
-               if (iSet < 0 || keyVariable_[iSet] >= numberColumns) {
-                    for (j = columnStart[iColumn]; j < columnStart[iColumn] + columnLength[iColumn]; j++) {
-                         double value = elementByColumn[j];
-                         if (fabs(value) > 1.0e-20) {
-                              int iRow = row[j];
-                              indexRowU[numberElements] = iRow;
-                              rowCount[iRow]++;
-                              elementU[numberElements++] = value;
-                         }
-                    }
-                    // end of column
-                    columnCount[numberBasic] = numberElements - start[numberBasic];
-                    numberBasic++;
-                    start[numberBasic] = numberElements;
-               } else {
-                    // in gub set
-                    if (iColumn != keyVariable_[iSet]) {
-                         // not key
-                         if (lastSet != iSet) {
-                              // erase work
-                              if (key >= 0) {
-                                   for (j = columnStart[key]; j < columnStart[key] + keyLength; j++) {
-                                        int iRow = row[j];
-                                        work[iRow] = 0.0;
-                                        mark[iRow] = 0;
-                                   }
-                              }
-                              key = keyVariable_[iSet];
-                              lastSet = iSet;
-                              keyLength = columnLength[key];
-                              for (j = columnStart[key]; j < columnStart[key] + keyLength; j++) {
-                                   int iRow = row[j];
-                                   work[iRow] = elementByColumn[j];
-                                   mark[iRow] = 1;
-                              }
-                         }
-                         for (j = columnStart[iColumn]; j < columnStart[iColumn] + length; j++) {
-                              int iRow = row[j];
-                              double value = elementByColumn[j];
-                              if (mark[iRow]) {
-                                   mark[iRow] = 0;
-                                   double keyValue = work[iRow];
-                                   value -= keyValue;
-                              }
-                              if (fabs(value) > 1.0e-20) {
-                                   indexRowU[numberElements] = iRow;
-                                   rowCount[iRow]++;
-                                   elementU[numberElements++] = value;
-                              }
-                         }
-                         for (j = columnStart[key]; j < columnStart[key] + keyLength; j++) {
-                              int iRow = row[j];
-                              if (mark[iRow]) {
-                                   double value = -work[iRow];
-                                   if (fabs(value) > 1.0e-20) {
-                                        indexRowU[numberElements] = iRow;
-                                        rowCount[iRow]++;
-                                        elementU[numberElements++] = value;
-                                   }
-                              } else {
-                                   // just put back mark
-                                   mark[iRow] = 1;
-                              }
-                         }
-                         // end of column
-                         columnCount[numberBasic] = numberElements - start[numberBasic];
-                         numberBasic++;
-                         start[numberBasic] = numberElements;
-                    }
-               }
-          }
-     } else {
-          // scaling
-          const double * columnScale = model->columnScale();
-          for (i = 0; i < numberColumnBasic; i++) {
-               int iColumn = whichColumn[i];
-               int iSet = backward_[iColumn];
-               int length = columnLength[iColumn];
-               CoinBigIndex j;
-               if (iSet < 0 || keyVariable_[iSet] >= numberColumns) {
-                    double scale = columnScale[iColumn];
-                    for (j = columnStart[iColumn]; j < columnStart[iColumn] + columnLength[iColumn]; j++) {
-                         int iRow = row[j];
-                         double value = elementByColumn[j] * scale * rowScale[iRow];
-                         if (fabs(value) > 1.0e-20) {
-                              indexRowU[numberElements] = iRow;
-                              rowCount[iRow]++;
-                              elementU[numberElements++] = value;
-                         }
-                    }
-                    // end of column
-                    columnCount[numberBasic] = numberElements - start[numberBasic];
-                    numberBasic++;
-                    start[numberBasic] = numberElements;
-               } else {
-                    // in gub set
-                    if (iColumn != keyVariable_[iSet]) {
-                         double scale = columnScale[iColumn];
-                         // not key
-                         if (lastSet < iSet) {
-                              // erase work
-                              if (key >= 0) {
-                                   for (j = columnStart[key]; j < columnStart[key] + keyLength; j++) {
-                                        int iRow = row[j];
-                                        work[iRow] = 0.0;
-                                        mark[iRow] = 0;
-                                   }
-                              }
-                              key = keyVariable_[iSet];
-                              lastSet = iSet;
-                              keyLength = columnLength[key];
-                              double scale = columnScale[key];
-                              for (j = columnStart[key]; j < columnStart[key] + keyLength; j++) {
-                                   int iRow = row[j];
-                                   work[iRow] = elementByColumn[j] * scale * rowScale[iRow];
-                                   mark[iRow] = 1;
-                              }
-                         }
-                         for (j = columnStart[iColumn]; j < columnStart[iColumn] + length; j++) {
-                              int iRow = row[j];
-                              double value = elementByColumn[j] * scale * rowScale[iRow];
-                              if (mark[iRow]) {
-                                   mark[iRow] = 0;
-                                   double keyValue = work[iRow];
-                                   value -= keyValue;
-                              }
-                              if (fabs(value) > 1.0e-20) {
-                                   indexRowU[numberElements] = iRow;
-                                   rowCount[iRow]++;
-                                   elementU[numberElements++] = value;
-                              }
-                         }
-                         for (j = columnStart[key]; j < columnStart[key] + keyLength; j++) {
-                              int iRow = row[j];
-                              if (mark[iRow]) {
-                                   double value = -work[iRow];
-                                   if (fabs(value) > 1.0e-20) {
-                                        indexRowU[numberElements] = iRow;
-                                        rowCount[iRow]++;
-                                        elementU[numberElements++] = value;
-                                   }
-                              } else {
-                                   // just put back mark
-                                   mark[iRow] = 1;
-                              }
-                         }
-                         // end of column
-                         columnCount[numberBasic] = numberElements - start[numberBasic];
-                         numberBasic++;
-                         start[numberBasic] = numberElements;
-                    }
-               }
-          }
-     }
-     delete [] work;
-     delete [] mark;
-     // update number of column basic
-     numberColumnBasic = numberBasic;
-}
-/* Unpacks a column into an CoinIndexedvector
- */
-void
-ClpGubMatrix::unpack(const ClpSimplex * model, CoinIndexedVector * rowArray,
-                     int iColumn) const
-{
-     assert (iColumn < model->numberColumns());
-     // Do packed part
-     ClpPackedMatrix::unpack(model, rowArray, iColumn);
-     int iSet = backward_[iColumn];
-     if (iSet >= 0) {
-          int iBasic = keyVariable_[iSet];
-          if (iBasic < model->numberColumns()) {
-               add(model, rowArray, iBasic, -1.0);
-          }
-     }
-}
-/* Unpacks a column into a CoinIndexedVector
-** in packed format
-Note that model is NOT const.  Bounds and objective could
-be modified if doing column generation (just for this variable) */
-void
-ClpGubMatrix::unpackPacked(ClpSimplex * model,
-                           CoinIndexedVector * rowArray,
-                           int iColumn) const
-{
-     int numberColumns = model->numberColumns();
-     if (iColumn < numberColumns) {
-          // Do packed part
-          ClpPackedMatrix::unpackPacked(model, rowArray, iColumn);
-          int iSet = backward_[iColumn];
-          if (iSet >= 0) {
-               // columns are in order
-               int iBasic = keyVariable_[iSet];
-               if (iBasic < numberColumns) {
-                    int number = rowArray->getNumElements();
-                    const double * rowScale = model->rowScale();
-                    const int * row = matrix_->getIndices();
-                    const CoinBigIndex * columnStart = matrix_->getVectorStarts();
-                    const int * columnLength = matrix_->getVectorLengths();
-                    const double * elementByColumn = matrix_->getElements();
-                    double * array = rowArray->denseVector();
-                    int * index = rowArray->getIndices();
-                    CoinBigIndex i;
-                    int numberOld = number;
-                    int lastIndex = 0;
-                    int next = index[lastIndex];
-                    if (!rowScale) {
-                         for (i = columnStart[iBasic];
-                                   i < columnStart[iBasic] + columnLength[iBasic]; i++) {
-                              int iRow = row[i];
-                              while (iRow > next) {
-                                   lastIndex++;
-                                   if (lastIndex == numberOld)
-                                        next = matrix_->getNumRows();
-                                   else
-                                        next = index[lastIndex];
-                              }
-                              if (iRow < next) {
-                                   array[number] = -elementByColumn[i];
-                                   index[number++] = iRow;
-                              } else {
-                                   assert (iRow == next);
-                                   array[lastIndex] -= elementByColumn[i];
-                                   if (!array[lastIndex])
-                                        array[lastIndex] = 1.0e-100;
-                              }
-                         }
-                    } else {
-                         // apply scaling
-                         double scale = model->columnScale()[iBasic];
-                         for (i = columnStart[iBasic];
-                                   i < columnStart[iBasic] + columnLength[iBasic]; i++) {
-                              int iRow = row[i];
-                              while (iRow > next) {
-                                   lastIndex++;
-                                   if (lastIndex == numberOld)
-                                        next = matrix_->getNumRows();
-                                   else
-                                        next = index[lastIndex];
-                              }
-                              if (iRow < next) {
-                                   array[number] = -elementByColumn[i] * scale * rowScale[iRow];
-                                   index[number++] = iRow;
-                              } else {
-                                   assert (iRow == next);
-                                   array[lastIndex] -= elementByColumn[i] * scale * rowScale[iRow];
-                                   if (!array[lastIndex])
-                                        array[lastIndex] = 1.0e-100;
-                              }
-                         }
-                    }
-                    rowArray->setNumElements(number);
-               }
-          }
-     } else {
-          // key slack entering
-          int iBasic = keyVariable_[gubSlackIn_];
-          assert (iBasic < numberColumns);
-          int number = 0;
-          const double * rowScale = model->rowScale();
-          const int * row = matrix_->getIndices();
-          const CoinBigIndex * columnStart = matrix_->getVectorStarts();
-          const int * columnLength = matrix_->getVectorLengths();
-          const double * elementByColumn = matrix_->getElements();
-          double * array = rowArray->denseVector();
-          int * index = rowArray->getIndices();
-          CoinBigIndex i;
-          if (!rowScale) {
-               for (i = columnStart[iBasic];
-                         i < columnStart[iBasic] + columnLength[iBasic]; i++) {
-                    int iRow = row[i];
-                    array[number] = elementByColumn[i];
-                    index[number++] = iRow;
-               }
-          } else {
-               // apply scaling
-               double scale = model->columnScale()[iBasic];
-               for (i = columnStart[iBasic];
-                         i < columnStart[iBasic] + columnLength[iBasic]; i++) {
-                    int iRow = row[i];
-                    array[number] = elementByColumn[i] * scale * rowScale[iRow];
-                    index[number++] = iRow;
-               }
-          }
-          rowArray->setNumElements(number);
-          rowArray->setPacked();
-     }
-}
-/* Adds multiple of a column into an CoinIndexedvector
-      You can use quickAdd to add to vector */
-void
-ClpGubMatrix::add(const ClpSimplex * model, CoinIndexedVector * rowArray,
-                  int iColumn, double multiplier) const
-{
-     assert (iColumn < model->numberColumns());
-     // Do packed part
-     ClpPackedMatrix::add(model, rowArray, iColumn, multiplier);
-     int iSet = backward_[iColumn];
-     if (iSet >= 0 && iColumn != keyVariable_[iSet]) {
-          ClpPackedMatrix::add(model, rowArray, keyVariable_[iSet], -multiplier);
-     }
-}
-/* Adds multiple of a column into an array */
-void
-ClpGubMatrix::add(const ClpSimplex * model, double * array,
-                  int iColumn, double multiplier) const
-{
-     assert (iColumn < model->numberColumns());
-     // Do packed part
-     ClpPackedMatrix::add(model, array, iColumn, multiplier);
-     if (iColumn < model->numberColumns()) {
-          int iSet = backward_[iColumn];
-          if (iSet >= 0 && iColumn != keyVariable_[iSet] && keyVariable_[iSet] < model->numberColumns()) {
-               ClpPackedMatrix::add(model, array, keyVariable_[iSet], -multiplier);
-          }
-     }
-}
-// Partial pricing
-void
-ClpGubMatrix::partialPricing(ClpSimplex * model, double startFraction, double endFraction,
-                             int & bestSequence, int & numberWanted)
-{
-     numberWanted = currentWanted_;
-     if (numberSets_) {
-          // Do packed part before gub
-          int numberColumns = matrix_->getNumCols();
-          double ratio = static_cast<double> (firstGub_) /
-                         static_cast<double> (numberColumns);
-          ClpPackedMatrix::partialPricing(model, startFraction * ratio,
-                                          endFraction * ratio, bestSequence, numberWanted);
-          if (numberWanted || minimumGoodReducedCosts_ < -1) {
-               // do gub
-               const double * element = matrix_->getElements();
-               const int * row = matrix_->getIndices();
-               const CoinBigIndex * startColumn = matrix_->getVectorStarts();
-               const int * length = matrix_->getVectorLengths();
-               const double * rowScale = model->rowScale();
-               const double * columnScale = model->columnScale();
-               int iSequence;
-               CoinBigIndex j;
-               double tolerance = model->currentDualTolerance();
-               double * reducedCost = model->djRegion();
-               const double * duals = model->dualRowSolution();
-               const double * cost = model->costRegion();
-               double bestDj;
-               int numberColumns = model->numberColumns();
-               int numberRows = model->numberRows();
-               if (bestSequence >= 0)
-                    bestDj = fabs(this->reducedCost(model, bestSequence));
-               else
-                    bestDj = tolerance;
-               int sequenceOut = model->sequenceOut();
-               int saveSequence = bestSequence;
-               int startG = firstGub_ + static_cast<int> (startFraction * (lastGub_ - firstGub_));
-               int endG = firstGub_ + static_cast<int> (endFraction * (lastGub_ - firstGub_));
-               endG = CoinMin(lastGub_, endG + 1);
-               // If nothing found yet can go all the way to end
-               int endAll = endG;
-               if (bestSequence < 0 && !startG)
-                    endAll = lastGub_;
-               int minSet = minimumObjectsScan_ < 0 ? 5 : minimumObjectsScan_;
-               int minNeg = minimumGoodReducedCosts_ == -1 ? 5 : minimumGoodReducedCosts_;
-               int nSets = 0;
-               int iSet = -1;
-               double djMod = 0.0;
-               double infeasibilityCost = model->infeasibilityCost();
-               if (rowScale) {
-                    double bestDjMod = 0.0;
-                    // scaled
-                    for (iSequence = startG; iSequence < endAll; iSequence++) {
-                         if (numberWanted + minNeg < originalWanted_ && nSets > minSet) {
-                              // give up
-                              numberWanted = 0;
-                              break;
-                         } else if (iSequence == endG && bestSequence >= 0) {
-                              break;
-                         }
-                         if (backward_[iSequence] != iSet) {
-                              // get pi on gub row
-                              iSet = backward_[iSequence];
-                              if (iSet >= 0) {
-                                   nSets++;
-                                   int iBasic = keyVariable_[iSet];
-                                   if (iBasic >= numberColumns) {
-                                        djMod = - weight(iSet) * infeasibilityCost;
-                                   } else {
-                                        // get dj without
-                                        assert (model->getStatus(iBasic) == ClpSimplex::basic);
-                                        djMod = 0.0;
-                                        // scaled
-                                        for (j = startColumn[iBasic];
-                                                  j < startColumn[iBasic] + length[iBasic]; j++) {
-                                             int jRow = row[j];
-                                             djMod -= duals[jRow] * element[j] * rowScale[jRow];
-                                        }
-                                        // allow for scaling
-                                        djMod +=  cost[iBasic] / columnScale[iBasic];
-                                        // See if gub slack possible - dj is djMod
-                                        if (getStatus(iSet) == ClpSimplex::atLowerBound) {
-                                             double value = -djMod;
-                                             if (value > tolerance) {
-                                                  numberWanted--;
-                                                  if (value > bestDj) {
-                                                       // check flagged variable and correct dj
-                                                       if (!flagged(iSet)) {
-                                                            bestDj = value;
-                                                            bestSequence = numberRows + numberColumns + iSet;
-                                                            bestDjMod = djMod;
-                                                       } else {
-                                                            // just to make sure we don't exit before got something
-                                                            numberWanted++;
-                                                            abort();
-                                                       }
-                                                  }
-                                             }
-                                        } else if (getStatus(iSet) == ClpSimplex::atUpperBound) {
-                                             double value = djMod;
-                                             if (value > tolerance) {
-                                                  numberWanted--;
-                                                  if (value > bestDj) {
-                                                       // check flagged variable and correct dj
-                                                       if (!flagged(iSet)) {
-                                                            bestDj = value;
-                                                            bestSequence = numberRows + numberColumns + iSet;
-                                                            bestDjMod = djMod;
-                                                       } else {
-                                                            // just to make sure we don't exit before got something
-                                                            numberWanted++;
-                                                            abort();
-                                                       }
-                                                  }
-                                             }
-                                        }
-                                   }
-                              } else {
-                                   // not in set
-                                   djMod = 0.0;
-                              }
-                         }
-                         if (iSequence != sequenceOut) {
-                              double value;
-                              ClpSimplex::Status status = model->getStatus(iSequence);
-
-                              switch(status) {
-
-                              case ClpSimplex::basic:
-                              case ClpSimplex::isFixed:
-                                   break;
-                              case ClpSimplex::isFree:
-                              case ClpSimplex::superBasic:
-                                   value = -djMod;
-                                   // scaled
-                                   for (j = startColumn[iSequence];
-                                             j < startColumn[iSequence] + length[iSequence]; j++) {
-                                        int jRow = row[j];
-                                        value -= duals[jRow] * element[j] * rowScale[jRow];
-                                   }
-                                   value = fabs(cost[iSequence] + value * columnScale[iSequence]);
-                                   if (value > FREE_ACCEPT * tolerance) {
-                                        numberWanted--;
-                                        // we are going to bias towards free (but only if reasonable)
-                                        value *= FREE_BIAS;
-                                        if (value > bestDj) {
-                                             // check flagged variable and correct dj
-                                             if (!model->flagged(iSequence)) {
-                                                  bestDj = value;
-                                                  bestSequence = iSequence;
-                                                  bestDjMod = djMod;
-                                             } else {
-                                                  // just to make sure we don't exit before got something
-                                                  numberWanted++;
-                                             }
-                                        }
-                                   }
-                                   break;
-                              case ClpSimplex::atUpperBound:
-                                   value = -djMod;
-                                   // scaled
-                                   for (j = startColumn[iSequence];
-                                             j < startColumn[iSequence] + length[iSequence]; j++) {
-                                        int jRow = row[j];
-                                        value -= duals[jRow] * element[j] * rowScale[jRow];
-                                   }
-                                   value = cost[iSequence] + value * columnScale[iSequence];
-                                   if (value > tolerance) {
-                                        numberWanted--;
-                                        if (value > bestDj) {
-                                             // check flagged variable and correct dj
-                                             if (!model->flagged(iSequence)) {
-                                                  bestDj = value;
-                                                  bestSequence = iSequence;
-                                                  bestDjMod = djMod;
-                                             } else {
-                                                  // just to make sure we don't exit before got something
-                                                  numberWanted++;
-                                             }
-                                        }
-                                   }
-                                   break;
-                              case ClpSimplex::atLowerBound:
-                                   value = -djMod;
-                                   // scaled
-                                   for (j = startColumn[iSequence];
-                                             j < startColumn[iSequence] + length[iSequence]; j++) {
-                                        int jRow = row[j];
-                                        value -= duals[jRow] * element[j] * rowScale[jRow];
-                                   }
-                                   value = -(cost[iSequence] + value * columnScale[iSequence]);
-                                   if (value > tolerance) {
-                                        numberWanted--;
-                                        if (value > bestDj) {
-                                             // check flagged variable and correct dj
-                                             if (!model->flagged(iSequence)) {
-                                                  bestDj = value;
-                                                  bestSequence = iSequence;
-                                                  bestDjMod = djMod;
-                                             } else {
-                                                  // just to make sure we don't exit before got something
-                                                  numberWanted++;
-                                             }
-                                        }
-                                   }
-                                   break;
-                              }
-                         }
-                         if (!numberWanted)
-                              break;
-                    }
-                    if (bestSequence != saveSequence) {
-                         if (bestSequence < numberRows + numberColumns) {
-                              // recompute dj
-                              double value = bestDjMod;
-                              // scaled
-                              for (j = startColumn[bestSequence];
-                                        j < startColumn[bestSequence] + length[bestSequence]; j++) {
-                                   int jRow = row[j];
-                                   value -= duals[jRow] * element[j] * rowScale[jRow];
-                              }
-                              reducedCost[bestSequence] = cost[bestSequence] + value * columnScale[bestSequence];
-                              gubSlackIn_ = -1;
-                         } else {
-                              // slack - make last column
-                              gubSlackIn_ = bestSequence - numberRows - numberColumns;
-                              bestSequence = numberColumns + 2 * numberRows;
-                              reducedCost[bestSequence] = bestDjMod;
-                              model->setStatus(bestSequence, getStatus(gubSlackIn_));
-                              if (getStatus(gubSlackIn_) == ClpSimplex::atUpperBound)
-                                   model->solutionRegion()[bestSequence] = upper_[gubSlackIn_];
-                              else
-                                   model->solutionRegion()[bestSequence] = lower_[gubSlackIn_];
-                              model->lowerRegion()[bestSequence] = lower_[gubSlackIn_];
-                              model->upperRegion()[bestSequence] = upper_[gubSlackIn_];
-                              model->costRegion()[bestSequence] = 0.0;
-                         }
-                         savedBestSequence_ = bestSequence;
-                         savedBestDj_ = reducedCost[savedBestSequence_];
-                    }
-               } else {
-                    double bestDjMod = 0.0;
-                    //printf("iteration %d start %d end %d - wanted %d\n",model->numberIterations(),
-                    //     startG,endG,numberWanted);
-                    for (iSequence = startG; iSequence < endG; iSequence++) {
-                         if (numberWanted + minNeg < originalWanted_ && nSets > minSet) {
-                              // give up
-                              numberWanted = 0;
-                              break;
-                         } else if (iSequence == endG && bestSequence >= 0) {
-                              break;
-                         }
-                         if (backward_[iSequence] != iSet) {
-                              // get pi on gub row
-                              iSet = backward_[iSequence];
-                              if (iSet >= 0) {
-                                   nSets++;
-                                   int iBasic = keyVariable_[iSet];
-                                   if (iBasic >= numberColumns) {
-                                        djMod = - weight(iSet) * infeasibilityCost;
-                                   } else {
-                                        // get dj without
-                                        assert (model->getStatus(iBasic) == ClpSimplex::basic);
-                                        djMod = 0.0;
-
-                                        for (j = startColumn[iBasic];
-                                                  j < startColumn[iBasic] + length[iBasic]; j++) {
-                                             int jRow = row[j];
-                                             djMod -= duals[jRow] * element[j];
-                                        }
-                                        djMod += cost[iBasic];
-                                        // See if gub slack possible - dj is djMod
-                                        if (getStatus(iSet) == ClpSimplex::atLowerBound) {
-                                             double value = -djMod;
-                                             if (value > tolerance) {
-                                                  numberWanted--;
-                                                  if (value > bestDj) {
-                                                       // check flagged variable and correct dj
-                                                       if (!flagged(iSet)) {
-                                                            bestDj = value;
-                                                            bestSequence = numberRows + numberColumns + iSet;
-                                                            bestDjMod = djMod;
-                                                       } else {
-                                                            // just to make sure we don't exit before got something
-                                                            numberWanted++;
-                                                            abort();
-                                                       }
-                                                  }
-                                             }
-                                        } else if (getStatus(iSet) == ClpSimplex::atUpperBound) {
-                                             double value = djMod;
-                                             if (value > tolerance) {
-                                                  numberWanted--;
-                                                  if (value > bestDj) {
-                                                       // check flagged variable and correct dj
-                                                       if (!flagged(iSet)) {
-                                                            bestDj = value;
-                                                            bestSequence = numberRows + numberColumns + iSet;
-                                                            bestDjMod = djMod;
-                                                       } else {
-                                                            // just to make sure we don't exit before got something
-                                                            numberWanted++;
-                                                            abort();
-                                                       }
-                                                  }
-                                             }
-                                        }
-                                   }
-                              } else {
-                                   // not in set
-                                   djMod = 0.0;
-                              }
-                         }
-                         if (iSequence != sequenceOut) {
-                              double value;
-                              ClpSimplex::Status status = model->getStatus(iSequence);
-
-                              switch(status) {
-
-                              case ClpSimplex::basic:
-                              case ClpSimplex::isFixed:
-                                   break;
-                              case ClpSimplex::isFree:
-                              case ClpSimplex::superBasic:
-                                   value = cost[iSequence] - djMod;
-                                   for (j = startColumn[iSequence];
-                                             j < startColumn[iSequence] + length[iSequence]; j++) {
-                                        int jRow = row[j];
-                                        value -= duals[jRow] * element[j];
-                                   }
-                                   value = fabs(value);
-                                   if (value > FREE_ACCEPT * tolerance) {
-                                        numberWanted--;
-                                        // we are going to bias towards free (but only if reasonable)
-                                        value *= FREE_BIAS;
-                                        if (value > bestDj) {
-                                             // check flagged variable and correct dj
-                                             if (!model->flagged(iSequence)) {
-                                                  bestDj = value;
-                                                  bestSequence = iSequence;
-                                                  bestDjMod = djMod;
-                                             } else {
-                                                  // just to make sure we don't exit before got something
-                                                  numberWanted++;
-                                             }
-                                        }
-                                   }
-                                   break;
-                              case ClpSimplex::atUpperBound:
-                                   value = cost[iSequence] - djMod;
-                                   for (j = startColumn[iSequence];
-                                             j < startColumn[iSequence] + length[iSequence]; j++) {
-                                        int jRow = row[j];
-                                        value -= duals[jRow] * element[j];
-                                   }
-                                   if (value > tolerance) {
-                                        numberWanted--;
-                                        if (value > bestDj) {
-                                             // check flagged variable and correct dj
-                                             if (!model->flagged(iSequence)) {
-                                                  bestDj = value;
-                                                  bestSequence = iSequence;
-                                                  bestDjMod = djMod;
-                                             } else {
-                                                  // just to make sure we don't exit before got something
-                                                  numberWanted++;
-                                             }
-                                        }
-                                   }
-                                   break;
-                              case ClpSimplex::atLowerBound:
-                                   value = cost[iSequence] - djMod;
-                                   for (j = startColumn[iSequence];
-                                             j < startColumn[iSequence] + length[iSequence]; j++) {
-                                        int jRow = row[j];
-                                        value -= duals[jRow] * element[j];
-                                   }
-                                   value = -value;
-                                   if (value > tolerance) {
-                                        numberWanted--;
-                                        if (value > bestDj) {
-                                             // check flagged variable and correct dj
-                                             if (!model->flagged(iSequence)) {
-                                                  bestDj = value;
-                                                  bestSequence = iSequence;
-                                                  bestDjMod = djMod;
-                                             } else {
-                                                  // just to make sure we don't exit before got something
-                                                  numberWanted++;
-                                             }
-                                        }
-                                   }
-                                   break;
-                              }
-                         }
-                         if (!numberWanted)
-                              break;
-                    }
-                    if (bestSequence != saveSequence) {
-                         if (bestSequence < numberRows + numberColumns) {
-                              // recompute dj
-                              double value = cost[bestSequence] - bestDjMod;
-                              for (j = startColumn[bestSequence];
-                                        j < startColumn[bestSequence] + length[bestSequence]; j++) {
-                                   int jRow = row[j];
-                                   value -= duals[jRow] * element[j];
-                              }
-                              //printf("price struct %d - dj %g gubpi %g\n",bestSequence,value,bestDjMod);
-                              reducedCost[bestSequence] = value;
-                              gubSlackIn_ = -1;
-                         } else {
-                              // slack - make last column
-                              gubSlackIn_ = bestSequence - numberRows - numberColumns;
-                              bestSequence = numberColumns + 2 * numberRows;
-                              reducedCost[bestSequence] = bestDjMod;
-                              //printf("price slack %d - gubpi %g\n",gubSlackIn_,bestDjMod);
-                              model->setStatus(bestSequence, getStatus(gubSlackIn_));
-                              if (getStatus(gubSlackIn_) == ClpSimplex::atUpperBound)
-                                   model->solutionRegion()[bestSequence] = upper_[gubSlackIn_];
-                              else
-                                   model->solutionRegion()[bestSequence] = lower_[gubSlackIn_];
-                              model->lowerRegion()[bestSequence] = lower_[gubSlackIn_];
-                              model->upperRegion()[bestSequence] = upper_[gubSlackIn_];
-                              model->costRegion()[bestSequence] = 0.0;
-                         }
-                    }
-               }
-               // See if may be finished
-               if (startG == firstGub_ && bestSequence < 0)
-                    infeasibilityWeight_ = model_->infeasibilityCost();
-               else if (bestSequence >= 0)
-                    infeasibilityWeight_ = -1.0;
-          }
-          if (numberWanted) {
-               // Do packed part after gub
-               double offset = static_cast<double> (lastGub_) /
-                               static_cast<double> (numberColumns);
-               double ratio = static_cast<double> (numberColumns) /
-                              static_cast<double> (numberColumns) - offset;
-               double start2 = offset + ratio * startFraction;
-               double end2 = CoinMin(1.0, offset + ratio * endFraction + 1.0e-6);
-               ClpPackedMatrix::partialPricing(model, start2, end2, bestSequence, numberWanted);
-          }
-     } else {
-          // no gub
-          ClpPackedMatrix::partialPricing(model, startFraction, endFraction, bestSequence, numberWanted);
-     }
-     if (bestSequence >= 0)
-          infeasibilityWeight_ = -1.0; // not optimal
-     currentWanted_ = numberWanted;
-}
-/* expands an updated column to allow for extra rows which the main
-   solver does not know about and returns number added.
-*/
-int
-ClpGubMatrix::extendUpdated(ClpSimplex * model, CoinIndexedVector * update, int mode)
-{
-     // I think we only need to bother about sets with two in basis or incoming set
-     int number = update->getNumElements();
-     double * array = update->denseVector();
-     int * index = update->getIndices();
-     int i;
-     assert (!number || update->packedMode());
-     int * pivotVariable = model->pivotVariable();
-     int numberRows = model->numberRows();
-     int numberColumns = model->numberColumns();
-     int numberTotal = numberRows + numberColumns;
-     int sequenceIn = model->sequenceIn();
-     int returnCode = 0;
-     int iSetIn;
-     if (sequenceIn < numberColumns) {
-          iSetIn = backward_[sequenceIn];
-          gubSlackIn_ = -1; // in case set
-     } else if (sequenceIn < numberRows + numberColumns) {
-          iSetIn = -1;
-          gubSlackIn_ = -1; // in case set
-     } else {
-          iSetIn = gubSlackIn_;
-     }
-     double * lower = model->lowerRegion();
-     double * upper = model->upperRegion();
-     double * cost = model->costRegion();
-     double * solution = model->solutionRegion();
-     int number2 = number;
-     if (!mode) {
-          double primalTolerance = model->primalTolerance();
-          double infeasibilityCost = model->infeasibilityCost();
-          // extend
-          saveNumber_ = number;
-          for (i = 0; i < number; i++) {
-               int iRow = index[i];
-               int iPivot = pivotVariable[iRow];
-               if (iPivot < numberColumns) {
-                    int iSet = backward_[iPivot];
-                    if (iSet >= 0) {
-                         // two (or more) in set
-                         int iIndex = toIndex_[iSet];
-                         double otherValue = array[i];
-                         double value;
-                         if (iIndex < 0) {
-                              toIndex_[iSet] = number2;
-                              int iNew = number2 - number;
-                              fromIndex_[number2-number] = iSet;
-                              iIndex = number2;
-                              index[number2] = numberRows + iNew;
-                              // do key stuff
-                              int iKey = keyVariable_[iSet];
-                              if (iKey < numberColumns) {
-                                   // Save current cost of key
-                                   changeCost_[number2-number] = cost[iKey];
-                                   if (iSet != iSetIn)
-                                        value = 0.0;
-                                   else if (iSetIn != gubSlackIn_)
-                                        value = 1.0;
-                                   else
-                                        value = -1.0;
-                                   pivotVariable[numberRows+iNew] = iKey;
-                                   // Do I need to recompute?
-                                   double sol;
-                                   assert (getStatus(iSet) != ClpSimplex::basic);
-                                   if (getStatus(iSet) == ClpSimplex::atLowerBound)
-                                        sol = lower_[iSet];
-                                   else
-                                        sol = upper_[iSet];
-                                   if ((gubType_ & 8) != 0) {
-                                        int iColumn = next_[iKey];
-                                        // sum all non-key variables
-                                        while(iColumn >= 0) {
-                                             sol -= solution[iColumn];
-                                             iColumn = next_[iColumn];
-                                        }
-                                   } else {
-                                        int stop = -(iKey + 1);
-                                        int iColumn = next_[iKey];
-                                        // sum all non-key variables
-                                        while(iColumn != stop) {
-                                             if (iColumn < 0)
-                                                  iColumn = -iColumn - 1;
-                                             sol -= solution[iColumn];
-                                             iColumn = next_[iColumn];
-                                        }
-                                   }
-                                   solution[iKey] = sol;
-                                   if (model->algorithm() > 0)
-                                        model->nonLinearCost()->setOne(iKey, sol);
-                                   //assert (fabs(sol-solution[iKey])<1.0e-3);
-                              } else {
-                                   // gub slack is basic
-                                   // Save current cost of key
-                                   changeCost_[number2-number] = -weight(iSet) * infeasibilityCost;
-                                   otherValue = - otherValue; //allow for - sign on slack
-                                   if (iSet != iSetIn)
-                                        value = 0.0;
-                                   else
-                                        value = -1.0;
-                                   pivotVariable[numberRows+iNew] = iNew + numberTotal;
-                                   model->djRegion()[iNew+numberTotal] = 0.0;
-                                   double sol = 0.0;
-                                   if ((gubType_ & 8) != 0) {
-                                        int iColumn = next_[iKey];
-                                        // sum all non-key variables
-                                        while(iColumn >= 0) {
-                                             sol += solution[iColumn];
-                                             iColumn = next_[iColumn];
-                                        }
-                                   } else {
-                                        int stop = -(iKey + 1);
-                                        int iColumn = next_[iKey];
-                                        // sum all non-key variables
-                                        while(iColumn != stop) {
-                                             if (iColumn < 0)
-                                                  iColumn = -iColumn - 1;
-                                             sol += solution[iColumn];
-                                             iColumn = next_[iColumn];
-                                        }
-                                   }
-                                   solution[iNew+numberTotal] = sol;
-                                   // and do cost in nonLinearCost
-                                   if (model->algorithm() > 0)
-                                        model->nonLinearCost()->setOne(iNew + numberTotal, sol, lower_[iSet], upper_[iSet]);
-                                   if (sol > upper_[iSet] + primalTolerance) {
-                                        setAbove(iSet);
-                                        lower[iNew+numberTotal] = upper_[iSet];
-                                        upper[iNew+numberTotal] = COIN_DBL_MAX;
-                                   } else if (sol < lower_[iSet] - primalTolerance) {
-                                        setBelow(iSet);
-                                        lower[iNew+numberTotal] = -COIN_DBL_MAX;
-                                        upper[iNew+numberTotal] = lower_[iSet];
-                                   } else {
-                                        setFeasible(iSet);
-                                        lower[iNew+numberTotal] = lower_[iSet];
-                                        upper[iNew+numberTotal] = upper_[iSet];
-                                   }
-                                   cost[iNew+numberTotal] = weight(iSet) * infeasibilityCost;
-                              }
-                              number2++;
-                         } else {
-                              value = array[iIndex];
-                              int iKey = keyVariable_[iSet];
-                              if (iKey >= numberColumns)
-                                   otherValue = - otherValue; //allow for - sign on slack
-                         }
-                         value -= otherValue;
-                         array[iIndex] = value;
-                    }
-               }
-          }
-          if (iSetIn >= 0 && toIndex_[iSetIn] < 0) {
-               // Do incoming
-               update->setPacked(); // just in case no elements
-               toIndex_[iSetIn] = number2;
-               int iNew = number2 - number;
-               fromIndex_[number2-number] = iSetIn;
-               // Save current cost of key
-               double currentCost;
-               int key = keyVariable_[iSetIn];
-               if (key < numberColumns)
-                    currentCost = cost[key];
-               else
-                    currentCost = -weight(iSetIn) * infeasibilityCost;
-               changeCost_[number2-number] = currentCost;
-               index[number2] = numberRows + iNew;
-               // do key stuff
-               int iKey = keyVariable_[iSetIn];
-               if (iKey < numberColumns) {
-                    if (gubSlackIn_ < 0)
-                         array[number2] = 1.0;
-                    else
-                         array[number2] = -1.0;
-                    pivotVariable[numberRows+iNew] = iKey;
-                    // Do I need to recompute?
-                    double sol;
-                    assert (getStatus(iSetIn) != ClpSimplex::basic);
-                    if (getStatus(iSetIn) == ClpSimplex::atLowerBound)
-                         sol = lower_[iSetIn];
-                    else
-                         sol = upper_[iSetIn];
-                    if ((gubType_ & 8) != 0) {
-                         int iColumn = next_[iKey];
-                         // sum all non-key variables
-                         while(iColumn >= 0) {
-                              sol -= solution[iColumn];
-                              iColumn = next_[iColumn];
-                         }
-                    } else {
-                         // bounds exist - sum over all except key
-                         int stop = -(iKey + 1);
-                         int iColumn = next_[iKey];
-                         // sum all non-key variables
-                         while(iColumn != stop) {
-                              if (iColumn < 0)
-                                   iColumn = -iColumn - 1;
-                              sol -= solution[iColumn];
-                              iColumn = next_[iColumn];
-                         }
-                    }
-                    solution[iKey] = sol;
-                    if (model->algorithm() > 0)
-                         model->nonLinearCost()->setOne(iKey, sol);
-                    //assert (fabs(sol-solution[iKey])<1.0e-3);
-               } else {
-                    // gub slack is basic
-                    array[number2] = -1.0;
-                    pivotVariable[numberRows+iNew] = iNew + numberTotal;
-                    model->djRegion()[iNew+numberTotal] = 0.0;
-                    double sol = 0.0;
-                    if ((gubType_ & 8) != 0) {
-                         int iColumn = next_[iKey];
-                         // sum all non-key variables
-                         while(iColumn >= 0) {
-                              sol += solution[iColumn];
-                              iColumn = next_[iColumn];
-                         }
-                    } else {
-                         // bounds exist - sum over all except key
-                         int stop = -(iKey + 1);
-                         int iColumn = next_[iKey];
-                         // sum all non-key variables
-                         while(iColumn != stop) {
-                              if (iColumn < 0)
-                                   iColumn = -iColumn - 1;
-                              sol += solution[iColumn];
-                              iColumn = next_[iColumn];
-                         }
-                    }
-                    solution[iNew+numberTotal] = sol;
-                    // and do cost in nonLinearCost
-                    if (model->algorithm() > 0)
-                         model->nonLinearCost()->setOne(iNew + numberTotal, sol, lower_[iSetIn], upper_[iSetIn]);
-                    if (sol > upper_[iSetIn] + primalTolerance) {
-                         setAbove(iSetIn);
-                         lower[iNew+numberTotal] = upper_[iSetIn];
-                         upper[iNew+numberTotal] = COIN_DBL_MAX;
-                    } else if (sol < lower_[iSetIn] - primalTolerance) {
-                         setBelow(iSetIn);
-                         lower[iNew+numberTotal] = -COIN_DBL_MAX;
-                         upper[iNew+numberTotal] = lower_[iSetIn];
-                    } else {
-                         setFeasible(iSetIn);
-                         lower[iNew+numberTotal] = lower_[iSetIn];
-                         upper[iNew+numberTotal] = upper_[iSetIn];
-                    }
-                    cost[iNew+numberTotal] = weight(iSetIn) * infeasibilityCost;
-               }
-               number2++;
-          }
-          // mark end
-          fromIndex_[number2-number] = -1;
-          returnCode = number2 - number;
-          // make sure lower_ upper_ adjusted
-          synchronize(model, 9);
-     } else {
-          // take off?
-          if (number > saveNumber_) {
-               // clear
-               double theta = model->theta();
-               double * solution = model->solutionRegion();
-               for (i = saveNumber_; i < number; i++) {
-                    int iRow = index[i];
-                    int iColumn = pivotVariable[iRow];
-#ifdef CLP_DEBUG_PRINT
-                    printf("Column %d (set %d) lower %g, upper %g - alpha %g - old value %g, new %g (theta %g)\n",
-                           iColumn, fromIndex_[i-saveNumber_], lower[iColumn], upper[iColumn], array[i],
-                           solution[iColumn], solution[iColumn] - model->theta()*array[i], model->theta());
-#endif
-                    double value = array[i];
-                    array[i] = 0.0;
-                    int iSet = fromIndex_[i-saveNumber_];
-                    toIndex_[iSet] = -1;
-                    if (iSet == iSetIn && iColumn < numberColumns) {
-                         // update as may need value
-                         solution[iColumn] -= theta * value;
-                    }
-               }
-          }
-#ifdef CLP_DEBUG
-          for (i = 0; i < numberSets_; i++)
-               assert(toIndex_[i] == -1);
-#endif
-          number2 = saveNumber_;
-     }
-     update->setNumElements(number2);
-     return returnCode;
-}
-/*
-     utility primal function for dealing with dynamic constraints
-     mode=n see ClpGubMatrix.hpp for definition
-     Remember to update here when settled down
-*/
-void
-ClpGubMatrix::primalExpanded(ClpSimplex * model, int mode)
-{
-     int numberColumns = model->numberColumns();
-     switch (mode) {
-          // If key variable then slot in gub rhs so will get correct contribution
-     case 0: {
-          int i;
-          double * solution = model->solutionRegion();
-          ClpSimplex::Status iStatus;
-          for (i = 0; i < numberSets_; i++) {
-               int iColumn = keyVariable_[i];
-               if (iColumn < numberColumns) {
-                    // key is structural - where is slack
-                    iStatus = getStatus(i);
-                    assert (iStatus != ClpSimplex::basic);
-                    if (iStatus == ClpSimplex::atLowerBound)
-                         solution[iColumn] = lower_[i];
-                    else
-                         solution[iColumn] = upper_[i];
-               }
-          }
-     }
-     break;
-     // Compute values of key variables
-     case 1: {
-          int i;
-          double * solution = model->solutionRegion();
-          //const int * columnLength = matrix_->getVectorLengths();
-          //const CoinBigIndex * columnStart = matrix_->getVectorStarts();
-          //const int * row = matrix_->getIndices();
-          //const double * elementByColumn = matrix_->getElements();
-          //int * pivotVariable = model->pivotVariable();
-          sumPrimalInfeasibilities_ = 0.0;
-          numberPrimalInfeasibilities_ = 0;
-          double primalTolerance = model->primalTolerance();
-          double relaxedTolerance = primalTolerance;
-          // we can't really trust infeasibilities if there is primal error
-          double error = CoinMin(1.0e-2, model->largestPrimalError());
-          // allow tolerance at least slightly bigger than standard
-          relaxedTolerance = relaxedTolerance +  error;
-          // but we will be using difference
-          relaxedTolerance -= primalTolerance;
-          sumOfRelaxedPrimalInfeasibilities_ = 0.0;
-          for (i = 0; i < numberSets_; i++) { // Could just be over basics (esp if no bounds)
-               int kColumn = keyVariable_[i];
-               double value = 0.0;
-               if ((gubType_ & 8) != 0) {
-                    int iColumn = next_[kColumn];
-                    // sum all non-key variables
-                    while(iColumn >= 0) {
-                         value += solution[iColumn];
-                         iColumn = next_[iColumn];
-                    }
-               } else {
-                    // bounds exist - sum over all except key
-                    int stop = -(kColumn + 1);
-                    int iColumn = next_[kColumn];
-                    // sum all non-key variables
-                    while(iColumn != stop) {
-                         if (iColumn < 0)
-                              iColumn = -iColumn - 1;
-                         value += solution[iColumn];
-                         iColumn = next_[iColumn];
-                    }
-               }
-               if (kColumn < numberColumns) {
-                    // make sure key is basic - so will be skipped in values pass
-                    model->setStatus(kColumn, ClpSimplex::basic);
-                    // feasibility will be done later
-                    assert (getStatus(i) != ClpSimplex::basic);
-                    if (getStatus(i) == ClpSimplex::atUpperBound)
-                         solution[kColumn] = upper_[i] - value;
-                    else
-                         solution[kColumn] = lower_[i] - value;
-                    //printf("Value of key structural %d for set %d is %g\n",kColumn,i,solution[kColumn]);
-               } else {
-                    // slack is key
-                    assert (getStatus(i) == ClpSimplex::basic);
-                    double infeasibility = 0.0;
-                    if (value > upper_[i] + primalTolerance) {
-                         infeasibility = value - upper_[i] - primalTolerance;
-                         setAbove(i);
-                    } else if (value < lower_[i] - primalTolerance) {
-                         infeasibility = lower_[i] - value - primalTolerance ;
-                         setBelow(i);
-                    } else {
-                         setFeasible(i);
-                    }
-                    //printf("Value of key slack for set %d is %g\n",i,value);
-                    if (infeasibility > 0.0) {
-                         sumPrimalInfeasibilities_ += infeasibility;
-                         if (infeasibility > relaxedTolerance)
-                              sumOfRelaxedPrimalInfeasibilities_ += infeasibility;
-                         numberPrimalInfeasibilities_ ++;
-                    }
-               }
-          }
-     }
-     break;
-     // Report on infeasibilities of key variables
-     case 2: {
-          model->setSumPrimalInfeasibilities(model->sumPrimalInfeasibilities() +
-                                             sumPrimalInfeasibilities_);
-          model->setNumberPrimalInfeasibilities(model->numberPrimalInfeasibilities() +
-                                                numberPrimalInfeasibilities_);
-          model->setSumOfRelaxedPrimalInfeasibilities(model->sumOfRelaxedPrimalInfeasibilities() +
-                    sumOfRelaxedPrimalInfeasibilities_);
-     }
-     break;
-     }
-}
-/*
-     utility dual function for dealing with dynamic constraints
-     mode=n see ClpGubMatrix.hpp for definition
-     Remember to update here when settled down
-*/
-void
-ClpGubMatrix::dualExpanded(ClpSimplex * model,
-                           CoinIndexedVector * array,
-                           double * /*other*/, int mode)
-{
-     switch (mode) {
-          // modify costs before transposeUpdate
-     case 0: {
-          int i;
-          double * cost = model->costRegion();
-          // not dual values yet
-          //assert (!other);
-          //double * work = array->denseVector();
-          double infeasibilityCost = model->infeasibilityCost();
-          int * pivotVariable = model->pivotVariable();
-          int numberRows = model->numberRows();
-          int numberColumns = model->numberColumns();
-          for (i = 0; i < numberRows; i++) {
-               int iPivot = pivotVariable[i];
-               if (iPivot < numberColumns) {
-                    int iSet = backward_[iPivot];
-                    if (iSet >= 0) {
-                         int kColumn = keyVariable_[iSet];
-                         double costValue;
-                         if (kColumn < numberColumns) {
-                              // structural has cost
-                              costValue = cost[kColumn];
-                         } else {
-                              // slack is key
-                              assert (getStatus(iSet) == ClpSimplex::basic);
-                              // negative as -1.0 for slack
-                              costValue = -weight(iSet) * infeasibilityCost;
-                         }
-                         array->add(i, -costValue); // was work[i]-costValue
-                    }
-               }
-          }
-     }
-     break;
-     // create duals for key variables (without check on dual infeasible)
-     case 1: {
-          // If key slack then dual 0.0 (if feasible)
-          // dj for key is zero so that defines dual on set
-          int i;
-          double * dj = model->djRegion();
-          int numberColumns = model->numberColumns();
-          double infeasibilityCost = model->infeasibilityCost();
-          for (i = 0; i < numberSets_; i++) {
-               int kColumn = keyVariable_[i];
-               if (kColumn < numberColumns) {
-                    // dj without set
-                    double value = dj[kColumn];
-                    // Now subtract out from all
-                    dj[kColumn] = 0.0;
-                    int iColumn = next_[kColumn];
-                    // modify all non-key variables
-                    while(iColumn >= 0) {
-                         dj[iColumn] -= value;
-                         iColumn = next_[iColumn];
-                    }
-               } else {
-                    // slack key - may not be feasible
-                    assert (getStatus(i) == ClpSimplex::basic);
-                    // negative as -1.0 for slack
-                    double value = -weight(i) * infeasibilityCost;
-                    if (value) {
-                         int iColumn = next_[kColumn];
-                         // modify all non-key variables basic
-                         while(iColumn >= 0) {
-                              dj[iColumn] -= value;
-                              iColumn = next_[iColumn];
-                         }
-                    }
-               }
-          }
-     }
-     break;
-     // as 1 but check slacks and compute djs
-     case 2: {
-          // If key slack then dual 0.0
-          // If not then slack could be dual infeasible
-          // dj for key is zero so that defines dual on set
-          int i;
-          // make sure fromIndex will not confuse pricing
-          fromIndex_[0] = -1;
-          possiblePivotKey_ = -1;
-          // Create array
-          int numberColumns = model->numberColumns();
-          int * pivotVariable = model->pivotVariable();
-          int numberRows = model->numberRows();
-          for (i = 0; i < numberRows; i++) {
-               int iPivot = pivotVariable[i];
-               if (iPivot < numberColumns)
-                    backToPivotRow_[iPivot] = i;
-          }
-          if (noCheck_ >= 0) {
-               if (infeasibilityWeight_ != model->infeasibilityCost()) {
-                    // don't bother checking
-                    sumDualInfeasibilities_ = 100.0;
-                    numberDualInfeasibilities_ = 1;
-                    sumOfRelaxedDualInfeasibilities_ = 100.0;
-                    return;
-               }
-          }
-          double * dj = model->djRegion();
-          double * dual = model->dualRowSolution();
-          double * cost = model->costRegion();
-          ClpSimplex::Status iStatus;
-          const int * columnLength = matrix_->getVectorLengths();
-          const CoinBigIndex * columnStart = matrix_->getVectorStarts();
-          const int * row = matrix_->getIndices();
-          const double * elementByColumn = matrix_->getElements();
-          double infeasibilityCost = model->infeasibilityCost();
-          sumDualInfeasibilities_ = 0.0;
-          numberDualInfeasibilities_ = 0;
-          double dualTolerance = model->dualTolerance();
-          double relaxedTolerance = dualTolerance;
-          // we can't really trust infeasibilities if there is dual error
-          double error = CoinMin(1.0e-2, model->largestDualError());
-          // allow tolerance at least slightly bigger than standard
-          relaxedTolerance = relaxedTolerance +  error;
-          // but we will be using difference
-          relaxedTolerance -= dualTolerance;
-          sumOfRelaxedDualInfeasibilities_ = 0.0;
-          for (i = 0; i < numberSets_; i++) {
-               int kColumn = keyVariable_[i];
-               if (kColumn < numberColumns) {
-                    // dj without set
-                    double value = cost[kColumn];
-                    for (CoinBigIndex j = columnStart[kColumn];
-                              j < columnStart[kColumn] + columnLength[kColumn]; j++) {
-                         int iRow = row[j];
-                         value -= dual[iRow] * elementByColumn[j];
-                    }
-                    // Now subtract out from all
-                    dj[kColumn] -= value;
-                    int stop = -(kColumn + 1);
-                    kColumn = next_[kColumn];
-                    while (kColumn != stop) {
-                         if (kColumn < 0)
-                              kColumn = -kColumn - 1;
-                         double djValue = dj[kColumn] - value;
-                         dj[kColumn] = djValue;;
-                         double infeasibility = 0.0;
-                         iStatus = model->getStatus(kColumn);
-                         if (iStatus == ClpSimplex::atLowerBound) {
-                              if (djValue < -dualTolerance)
-                                   infeasibility = -djValue - dualTolerance;
-                         } else if (iStatus == ClpSimplex::atUpperBound) {
-                              // at upper bound
-                              if (djValue > dualTolerance)
-                                   infeasibility = djValue - dualTolerance;
-                         }
-                         if (infeasibility > 0.0) {
-                              sumDualInfeasibilities_ += infeasibility;
-                              if (infeasibility > relaxedTolerance)
-                                   sumOfRelaxedDualInfeasibilities_ += infeasibility;
-                              numberDualInfeasibilities_ ++;
-                         }
-                         kColumn = next_[kColumn];
-                    }
-                    // check slack
-                    iStatus = getStatus(i);
-                    assert (iStatus != ClpSimplex::basic);
-                    double infeasibility = 0.0;
-                    // dj of slack is -(-1.0)value
-                    if (iStatus == ClpSimplex::atLowerBound) {
-                         if (value < -dualTolerance)
-                              infeasibility = -value - dualTolerance;
-                    } else if (iStatus == ClpSimplex::atUpperBound) {
-                         // at upper bound
-                         if (value > dualTolerance)
-                              infeasibility = value - dualTolerance;
-                    }
-                    if (infeasibility > 0.0) {
-                         sumDualInfeasibilities_ += infeasibility;
-                         if (infeasibility > relaxedTolerance)
-                              sumOfRelaxedDualInfeasibilities_ += infeasibility;
-                         numberDualInfeasibilities_ ++;
-                    }
-               } else {
-                    // slack key - may not be feasible
-                    assert (getStatus(i) == ClpSimplex::basic);
-                    // negative as -1.0 for slack
-                    double value = -weight(i) * infeasibilityCost;
-                    if (value) {
-                         // Now subtract out from all
-                         int kColumn = i + numberColumns;
-                         int stop = -(kColumn + 1);
-                         kColumn = next_[kColumn];
-                         while (kColumn != stop) {
-                              if (kColumn < 0)
-                                   kColumn = -kColumn - 1;
-                              double djValue = dj[kColumn] - value;
-                              dj[kColumn] = djValue;;
-                              double infeasibility = 0.0;
-                              iStatus = model->getStatus(kColumn);
-                              if (iStatus == ClpSimplex::atLowerBound) {
-                                   if (djValue < -dualTolerance)
-                                        infeasibility = -djValue - dualTolerance;
-                              } else if (iStatus == ClpSimplex::atUpperBound) {
-                                   // at upper bound
-                                   if (djValue > dualTolerance)
-                                        infeasibility = djValue - dualTolerance;
-                              }
-                              if (infeasibility > 0.0) {
-                                   sumDualInfeasibilities_ += infeasibility;
-                                   if (infeasibility > relaxedTolerance)
-                                        sumOfRelaxedDualInfeasibilities_ += infeasibility;
-                                   numberDualInfeasibilities_ ++;
-                              }
-                              kColumn = next_[kColumn];
-                         }
-                    }
-               }
-          }
-          // and get statistics for column generation
-          synchronize(model, 4);
-          infeasibilityWeight_ = -1.0;
-     }
-     break;
-     // Report on infeasibilities of key variables
-     case 3: {
-          model->setSumDualInfeasibilities(model->sumDualInfeasibilities() +
-                                           sumDualInfeasibilities_);
-          model->setNumberDualInfeasibilities(model->numberDualInfeasibilities() +
-                                              numberDualInfeasibilities_);
-          model->setSumOfRelaxedDualInfeasibilities(model->sumOfRelaxedDualInfeasibilities() +
-                    sumOfRelaxedDualInfeasibilities_);
-     }
-     break;
-     // modify costs before transposeUpdate for partial pricing
-     case 4: {
-          // First compute new costs etc for interesting gubs
-          int iLook = 0;
-          int iSet = fromIndex_[0];
-          double primalTolerance = model->primalTolerance();
-          const double * cost = model->costRegion();
-          double * solution = model->solutionRegion();
-          double infeasibilityCost = model->infeasibilityCost();
-          int numberColumns = model->numberColumns();
-          int numberChanged = 0;
-          int * pivotVariable = model->pivotVariable();
-          while (iSet >= 0) {
-               int key = keyVariable_[iSet];
-               double value = 0.0;
-               // sum over all except key
-               if ((gubType_ & 8) != 0) {
-                    int iColumn = next_[key];
-                    // sum all non-key variables
-                    while(iColumn >= 0) {
-                         value += solution[iColumn];
-                         iColumn = next_[iColumn];
-                    }
-               } else {
-                    // bounds exist - sum over all except key
-                    int stop = -(key + 1);
-                    int iColumn = next_[key];
-                    // sum all non-key variables
-                    while(iColumn != stop) {
-                         if (iColumn < 0)
-                              iColumn = -iColumn - 1;
-                         value += solution[iColumn];
-                         iColumn = next_[iColumn];
-                    }
-               }
-               double costChange;
-               double oldCost = changeCost_[iLook];
-               if (key < numberColumns) {
-                    assert (getStatus(iSet) != ClpSimplex::basic);
-                    double sol;
-                    if (getStatus(iSet) == ClpSimplex::atUpperBound)
-                         sol = upper_[iSet] - value;
-                    else
-                         sol = lower_[iSet] - value;
-                    solution[key] = sol;
-                    // fix up cost
-                    model->nonLinearCost()->setOne(key, sol);
-#ifdef CLP_DEBUG_PRINT
-                    printf("yy Value of key structural %d for set %d is %g - cost %g old cost %g\n", key, iSet, sol,
-                           cost[key], oldCost);
-#endif
-                    costChange = cost[key] - oldCost;
-               } else {
-                    // slack is key
-                    if (value > upper_[iSet] + primalTolerance) {
-                         setAbove(iSet);
-                    } else if (value < lower_[iSet] - primalTolerance) {
-                         setBelow(iSet);
-                    } else {
-                         setFeasible(iSet);
-                    }
-                    // negative as -1.0 for slack
-                    costChange = -weight(iSet) * infeasibilityCost - oldCost;
-#ifdef CLP_DEBUG_PRINT
-                    printf("yy Value of key slack for set %d is %g - cost %g old cost %g\n", iSet, value,
-                           weight(iSet)*infeasibilityCost, oldCost);
-#endif
-               }
-               if (costChange) {
-                    fromIndex_[numberChanged] = iSet;
-                    toIndex_[iSet] = numberChanged;
-                    changeCost_[numberChanged++] = costChange;
-               }
-               iSet = fromIndex_[++iLook];
-          }
-          if (numberChanged || possiblePivotKey_ >= 0) {
-               // first do those in list already
-               int number = array->getNumElements();
-               array->setPacked();
-               int i;
-               double * work = array->denseVector();
-               int * which = array->getIndices();
-               for (i = 0; i < number; i++) {
-                    int iRow = which[i];
-                    int iPivot = pivotVariable[iRow];
-                    if (iPivot < numberColumns) {
-                         int iSet = backward_[iPivot];
-                         if (iSet >= 0 && toIndex_[iSet] >= 0) {
-                              double newValue = work[i] + changeCost_[toIndex_[iSet]];
-                              if (!newValue)
-                                   newValue = 1.0e-100;
-                              work[i] = newValue;
-                              // mark as done
-                              backward_[iPivot] = -1;
-                         }
-                    }
-                    if (possiblePivotKey_ == iRow) {
-                         double newValue = work[i] - model->dualIn();
-                         if (!newValue)
-                              newValue = 1.0e-100;
-                         work[i] = newValue;
-                         possiblePivotKey_ = -1;
-                    }
-               }
-               // now do rest and clean up
-               for (i = 0; i < numberChanged; i++) {
-                    int iSet = fromIndex_[i];
-                    int key = keyVariable_[iSet];
-                    int iColumn = next_[key];
-                    double change = changeCost_[i];
-                    while (iColumn >= 0) {
-                         if (backward_[iColumn] >= 0) {
-                              int iRow = backToPivotRow_[iColumn];
-                              assert (iRow >= 0);
-                              work[number] = change;
-                              if (possiblePivotKey_ == iRow) {
-                                   double newValue = work[number] - model->dualIn();
-                                   if (!newValue)
-                                        newValue = 1.0e-100;
-                                   work[number] = newValue;
-                                   possiblePivotKey_ = -1;
-                              }
-                              which[number++] = iRow;
-                         } else {
-                              // reset
-                              backward_[iColumn] = iSet;
-                         }
-                         iColumn = next_[iColumn];
-                    }
-                    toIndex_[iSet] = -1;
-               }
-               if (possiblePivotKey_ >= 0) {
-                    work[number] = -model->dualIn();
-                    which[number++] = possiblePivotKey_;
-                    possiblePivotKey_ = -1;
-               }
-               fromIndex_[0] = -1;
-               array->setNumElements(number);
-          }
-     }
-     break;
-     }
-}
-// This is local to Gub to allow synchronization when status is good
-int
-ClpGubMatrix::synchronize(ClpSimplex *, int)
-{
-     return 0;
-}
-/*
-     general utility function for dealing with dynamic constraints
-     mode=n see ClpGubMatrix.hpp for definition
-     Remember to update here when settled down
-*/
-int
-ClpGubMatrix::generalExpanded(ClpSimplex * model, int mode, int &number)
-{
-     int returnCode = 0;
-     int numberColumns = model->numberColumns();
-     switch (mode) {
-          // Fill in pivotVariable but not for key variables
-     case 0: {
-          if (!next_ ) {
-               // do ordering
-               assert (!rhsOffset_);
-               // create and do gub crash
-               useEffectiveRhs(model, false);
-          }
-          int i;
-          int numberBasic = number;
-          // Use different array so can build from true pivotVariable_
-          //int * pivotVariable = model->pivotVariable();
-          int * pivotVariable = model->rowArray(0)->getIndices();
-          for (i = 0; i < numberColumns; i++) {
-               if (model->getColumnStatus(i) == ClpSimplex::basic) {
-                    int iSet = backward_[i];
-                    if (iSet < 0 || i != keyVariable_[iSet])
-                         pivotVariable[numberBasic++] = i;
-               }
-          }
-          number = numberBasic;
-          if (model->numberIterations())
-               assert (number == model->numberRows());
-     }
-     break;
-     // Make all key variables basic
-     case 1: {
-          int i;
-          for (i = 0; i < numberSets_; i++) {
-               int iColumn = keyVariable_[i];
-               if (iColumn < numberColumns)
-                    model->setColumnStatus(iColumn, ClpSimplex::basic);
-          }
-     }
-     break;
-     // Do initial extra rows + maximum basic
-     case 2: {
-          returnCode = getNumRows() + 1;
-          number = model->numberRows() + numberSets_;
-     }
-     break;
-     // Before normal replaceColumn
-     case 3: {
-          int sequenceIn = model->sequenceIn();
-          int sequenceOut = model->sequenceOut();
-          int numberColumns = model->numberColumns();
-          int numberRows = model->numberRows();
-          int pivotRow = model->pivotRow();
-          if (gubSlackIn_ >= 0)
-               assert (sequenceIn > numberRows + numberColumns);
-          if (sequenceIn == sequenceOut)
-               return -1;
-          int iSetIn = -1;
-          int iSetOut = -1;
-          if (sequenceOut < numberColumns) {
-               iSetOut = backward_[sequenceOut];
-          } else if (sequenceOut >= numberRows + numberColumns) {
-               assert (pivotRow >= numberRows);
-               int iExtra = pivotRow - numberRows;
-               assert (iExtra >= 0);
-               if (iSetOut < 0)
-                    iSetOut = fromIndex_[iExtra];
-               else
-                    assert(iSetOut == fromIndex_[iExtra]);
-          }
-          if (sequenceIn < numberColumns) {
-               iSetIn = backward_[sequenceIn];
-          } else if (gubSlackIn_ >= 0) {
-               iSetIn = gubSlackIn_;
-          }
-          possiblePivotKey_ = -1;
-          number = 0; // say do ordinary
-          int * pivotVariable = model->pivotVariable();
-          if (pivotRow >= numberRows) {
-               int iExtra = pivotRow - numberRows;
-               //const int * length = matrix_->getVectorLengths();
-
-               assert (sequenceOut >= numberRows + numberColumns ||
-                       sequenceOut == keyVariable_[iSetOut]);
-               int incomingColumn = sequenceIn; // to be used in updates
-               if (iSetIn != iSetOut) {
-                    // We need to find a possible pivot for incoming
-                    // look through rowArray_[1]
-                    int n = model->rowArray(1)->getNumElements();
-                    int * which = model->rowArray(1)->getIndices();
-                    double * array = model->rowArray(1)->denseVector();
-                    double bestAlpha = 1.0e-5;
-                    //int shortest=numberRows+1;
-                    for (int i = 0; i < n; i++) {
-                         int iRow = which[i];
-                         int iPivot = pivotVariable[iRow];
-                         if (iPivot < numberColumns && backward_[iPivot] == iSetOut) {
-                              if (fabs(array[i]) > fabs(bestAlpha)) {
-                                   bestAlpha = array[i];
-                                   possiblePivotKey_ = iRow;
-                              }
-                         }
-                    }
-                    assert (possiblePivotKey_ >= 0); // could set returnCode=4
-                    number = 1;
-                    if (sequenceIn >= numberRows + numberColumns) {
-                         number = 3;
-                         // need swap as gub slack in and must become key
-                         // is this best way
-                         int key = keyVariable_[iSetIn];
-                         assert (key < numberColumns);
-                         // check other basic
-                         int iColumn = next_[key];
-                         // set new key to be used by unpack
-                         keyVariable_[iSetIn] = iSetIn + numberColumns;
-                         // change cost in changeCost
-                         {
-                              int iLook = 0;
-                              int iSet = fromIndex_[0];
-                              while (iSet >= 0) {
-                                   if (iSet == iSetIn) {
-                                        changeCost_[iLook] = 0.0;
-                                        break;
-                                   }
-                                   iSet = fromIndex_[++iLook];
-                              }
-                         }
-                         while (iColumn >= 0) {
-                              if (iColumn != sequenceOut) {
-                                   // need partial ftran and skip accuracy check in replaceColumn
-#ifdef CLP_DEBUG_PRINT
-                                   printf("TTTTTry 5\n");
-#endif
-                                   int iRow = backToPivotRow_[iColumn];
-                                   assert (iRow >= 0);
-                                   unpack(model, model->rowArray(3), iColumn);
-                                   model->factorization()->updateColumnFT(model->rowArray(2), model->rowArray(3));
-                                   double alpha = model->rowArray(3)->denseVector()[iRow];
-                                   //if (!alpha)
-                                   //printf("zero alpha a\n");
-                                   int updateStatus = model->factorization()->replaceColumn(model,
-                                                      model->rowArray(2),
-                                                      model->rowArray(3),
-                                                      iRow, alpha);
-                                   returnCode = CoinMax(updateStatus, returnCode);
-                                   model->rowArray(3)->clear();
-                                   if (returnCode)
-                                        break;
-                              }
-                              iColumn = next_[iColumn];
-                         }
-                         if (!returnCode) {
-                              // now factorization looks as if key is out
-                              // pivot back in
-#ifdef CLP_DEBUG_PRINT
-                              printf("TTTTTry 6\n");
-#endif
-                              unpack(model, model->rowArray(3), key);
-                              model->factorization()->updateColumnFT(model->rowArray(2), model->rowArray(3));
-                              pivotRow = possiblePivotKey_;
-                              double alpha = model->rowArray(3)->denseVector()[pivotRow];
-                              //if (!alpha)
-                              //printf("zero alpha b\n");
-                              int updateStatus = model->factorization()->replaceColumn(model,
-                                                 model->rowArray(2),
-                                                 model->rowArray(3),
-                                                 pivotRow, alpha);
-                              returnCode = CoinMax(updateStatus, returnCode);
-                              model->rowArray(3)->clear();
-                         }
-                         // restore key
-                         keyVariable_[iSetIn] = key;
-                         // now alternate column can replace key on out
-                         incomingColumn = pivotVariable[possiblePivotKey_];
-                    } else {
-#ifdef CLP_DEBUG_PRINT
-                         printf("TTTTTTry 4 %d\n", possiblePivotKey_);
-#endif
-                         int updateStatus = model->factorization()->replaceColumn(model,
-                                            model->rowArray(2),
-                                            model->rowArray(1),
-                                            possiblePivotKey_,
-                                            bestAlpha);
-                         returnCode = CoinMax(updateStatus, returnCode);
-                         incomingColumn = pivotVariable[possiblePivotKey_];
-                    }
-
-                    //returnCode=4; // need swap
-               } else {
-                    // key swap
-                    number = -1;
-               }
-               int key = keyVariable_[iSetOut];
-               if (key < numberColumns)
-                    assert(key == sequenceOut);
-               // check if any other basic
-               int iColumn = next_[key];
-               if (returnCode)
-                    iColumn = -1; // skip if error on previous
-               // set new key to be used by unpack
-               if (incomingColumn < numberColumns)
-                    keyVariable_[iSetOut] = incomingColumn;
-               else
-                    keyVariable_[iSetOut] = iSetIn + numberColumns;
-               double * cost = model->costRegion();
-               if (possiblePivotKey_ < 0) {
-                    double dj = model->djRegion()[sequenceIn] - cost[sequenceIn];
-                    changeCost_[iExtra] = -dj;
-#ifdef CLP_DEBUG_PRINT
-                    printf("modifying changeCost %d by %g - cost %g\n", iExtra, dj, cost[sequenceIn]);
-#endif
-               }
-               while (iColumn >= 0) {
-                    if (iColumn != incomingColumn) {
-                         number = -2;
-                         // need partial ftran and skip accuracy check in replaceColumn
-#ifdef CLP_DEBUG_PRINT
-                         printf("TTTTTTry 1\n");
-#endif
-                         int iRow = backToPivotRow_[iColumn];
-                         assert (iRow >= 0 && iRow < numberRows);
-                         unpack(model, model->rowArray(3), iColumn);
-                         model->factorization()->updateColumnFT(model->rowArray(2), model->rowArray(3));
-                         double * array = model->rowArray(3)->denseVector();
-                         double alpha = array[iRow];
-                         //if (!alpha)
-                         //printf("zero alpha d\n");
-                         int updateStatus = model->factorization()->replaceColumn(model,
-                                            model->rowArray(2),
-                                            model->rowArray(3),
-                                            iRow, alpha);
-                         returnCode = CoinMax(updateStatus, returnCode);
-                         model->rowArray(3)->clear();
-                         if (returnCode)
-                              break;
-                    }
-                    iColumn = next_[iColumn];
-               }
-               // restore key
-               keyVariable_[iSetOut] = key;
-          } else if (sequenceIn >= numberRows + numberColumns) {
-               number = 2;
-               //returnCode=4;
-               // need swap as gub slack in and must become key
-               // is this best way
-               int key = keyVariable_[iSetIn];
-               assert (key < numberColumns);
-               // check other basic
-               int iColumn = next_[key];
-               // set new key to be used by unpack
-               keyVariable_[iSetIn] = iSetIn + numberColumns;
-               // change cost in changeCost
-               {
-                    int iLook = 0;
-                    int iSet = fromIndex_[0];
-                    while (iSet >= 0) {
-                         if (iSet == iSetIn) {
-                              changeCost_[iLook] = 0.0;
-                              break;
-                         }
-                         iSet = fromIndex_[++iLook];
-                    }
-               }
-               while (iColumn >= 0) {
-                    if (iColumn != sequenceOut) {
-                         // need partial ftran and skip accuracy check in replaceColumn
-#ifdef CLP_DEBUG_PRINT
-                         printf("TTTTTry 2\n");
-#endif
-                         int iRow = backToPivotRow_[iColumn];
-                         assert (iRow >= 0);
-                         unpack(model, model->rowArray(3), iColumn);
-                         model->factorization()->updateColumnFT(model->rowArray(2), model->rowArray(3));
-                         double alpha = model->rowArray(3)->denseVector()[iRow];
-                         //if (!alpha)
-                         //printf("zero alpha e\n");
-                         int updateStatus = model->factorization()->replaceColumn(model,
-                                            model->rowArray(2),
-                                            model->rowArray(3),
-                                            iRow, alpha);
-                         returnCode = CoinMax(updateStatus, returnCode);
-                         model->rowArray(3)->clear();
-                         if (returnCode)
-                              break;
-                    }
-                    iColumn = next_[iColumn];
-               }
-               if (!returnCode) {
-                    // now factorization looks as if key is out
-                    // pivot back in
-#ifdef CLP_DEBUG_PRINT
-                    printf("TTTTTry 3\n");
-#endif
-                    unpack(model, model->rowArray(3), key);
-                    model->factorization()->updateColumnFT(model->rowArray(2), model->rowArray(3));
-                    double alpha = model->rowArray(3)->denseVector()[pivotRow];
-                    //if (!alpha)
-                    //printf("zero alpha f\n");
-                    int updateStatus = model->factorization()->replaceColumn(model,
-                                       model->rowArray(2),
-                                       model->rowArray(3),
-                                       pivotRow, alpha);
-                    returnCode = CoinMax(updateStatus, returnCode);
-                    model->rowArray(3)->clear();
-               }
-               // restore key
-               keyVariable_[iSetIn] = key;
-          } else {
-               // normal - but might as well do here
-               returnCode = model->factorization()->replaceColumn(model,
-                            model->rowArray(2),
-                            model->rowArray(1),
-                            model->pivotRow(),
-                            model->alpha());
-          }
-     }
-#ifdef CLP_DEBUG_PRINT
-     printf("Update type after %d - status %d - pivot row %d\n",
-            number, returnCode, model->pivotRow());
-#endif
-     // see if column generation says time to re-factorize
-     returnCode = CoinMax(returnCode, synchronize(model, 5));
-     number = -1; // say no need for normal replaceColumn
-     break;
-     // To see if can dual or primal
-     case 4: {
-          returnCode = 1;
-     }
-     break;
-     // save status
-     case 5: {
-          synchronize(model, 0);
-          CoinMemcpyN(status_, numberSets_, saveStatus_);
-          CoinMemcpyN(keyVariable_, numberSets_, savedKeyVariable_);
-     }
-     break;
-     // restore status
-     case 6: {
-          CoinMemcpyN(saveStatus_, numberSets_, status_);
-          CoinMemcpyN(savedKeyVariable_, numberSets_, keyVariable_);
-          // restore firstAvailable_
-          synchronize(model, 7);
-          // redo next_
-          int i;
-          int * last = new int[numberSets_];
-          for (i = 0; i < numberSets_; i++) {
-               int iKey = keyVariable_[i];
-               assert(iKey >= numberColumns || backward_[iKey] == i);
-               last[i] = iKey;
-               // make sure basic
-               //if (iKey<numberColumns)
-               //model->setStatus(iKey,ClpSimplex::basic);
-          }
-          for (i = 0; i < numberColumns; i++) {
-               int iSet = backward_[i];
-               if (iSet >= 0) {
-                    next_[last[iSet]] = i;
-                    last[iSet] = i;
-               }
-          }
-          for (i = 0; i < numberSets_; i++) {
-               next_[last[i]] = -(keyVariable_[i] + 1);
-               redoSet(model, keyVariable_[i], keyVariable_[i], i);
-          }
-          delete [] last;
-          // redo pivotVariable
-          int * pivotVariable = model->pivotVariable();
-          int iRow;
-          int numberBasic = 0;
-          int numberRows = model->numberRows();
-          for (iRow = 0; iRow < numberRows; iRow++) {
-               if (model->getRowStatus(iRow) == ClpSimplex::basic) {
-                    numberBasic++;
-                    pivotVariable[iRow] = iRow + numberColumns;
-               } else {
-                    pivotVariable[iRow] = -1;
-               }
-          }
-          i = 0;
-          int iColumn;
-          for (iColumn = 0; iColumn < numberColumns; iColumn++) {
-               if (model->getStatus(iColumn) == ClpSimplex::basic) {
-                    int iSet = backward_[iColumn];
-                    if (iSet < 0 || keyVariable_[iSet] != iColumn) {
-                         while (pivotVariable[i] >= 0) {
-                              i++;
-                              assert (i < numberRows);
-                         }
-                         pivotVariable[i] = iColumn;
-                         backToPivotRow_[iColumn] = i;
-                         numberBasic++;
-                    }
-               }
-          }
-          assert (numberBasic == numberRows);
-          rhsOffset(model, true);
-     }
-     break;
-     // flag a variable
-     case 7: {
-          assert (number == model->sequenceIn());
-          synchronize(model, 1);
-          synchronize(model, 8);
-     }
-     break;
-     // unflag all variables
-     case 8: {
-          returnCode = synchronize(model, 2);
-     }
-     break;
-     // redo costs in primal
-     case 9: {
-          returnCode = synchronize(model, 3);
-     }
-     break;
-     // return 1 if there may be changing bounds on variable (column generation)
-     case 10: {
-          returnCode = synchronize(model, 6);
-     }
-     break;
-     // make sure set is clean
-     case 11: {
-          assert (number == model->sequenceIn());
-          returnCode = synchronize(model, 8);
-     }
-     break;
-     default:
-          break;
-     }
-     return returnCode;
-}
-// Sets up an effective RHS and does gub crash if needed
-void
-ClpGubMatrix::useEffectiveRhs(ClpSimplex * model, bool cheapest)
-{
-     // Do basis - cheapest or slack if feasible (unless cheapest set)
-     int longestSet = 0;
-     int iSet;
-     for (iSet = 0; iSet < numberSets_; iSet++)
-          longestSet = CoinMax(longestSet, end_[iSet] - start_[iSet]);
-
-     double * upper = new double[longestSet+1];
-     double * cost = new double[longestSet+1];
-     double * lower = new double[longestSet+1];
-     double * solution = new double[longestSet+1];
-     assert (!next_);
-     int numberColumns = getNumCols();
-     const int * columnLength = matrix_->getVectorLengths();
-     const double * columnLower = model->lowerRegion();
-     const double * columnUpper = model->upperRegion();
-     double * columnSolution = model->solutionRegion();
-     const double * objective = model->costRegion();
-     int numberRows = getNumRows();
-     toIndex_ = new int[numberSets_];
-     for (iSet = 0; iSet < numberSets_; iSet++)
-          toIndex_[iSet] = -1;
-     fromIndex_ = new int [getNumRows()+1];
-     double tolerance = model->primalTolerance();
-     bool noNormalBounds = true;
-     gubType_ &= ~8;
-     bool gotBasis = false;
-     for (iSet = 0; iSet < numberSets_; iSet++) {
-          if (keyVariable_[iSet] < numberColumns)
-               gotBasis = true;
-          CoinBigIndex j;
-          CoinBigIndex iStart = start_[iSet];
-          CoinBigIndex iEnd = end_[iSet];
-          for (j = iStart; j < iEnd; j++) {
-               if (columnLower[j] && columnLower[j] > -1.0e20)
-                    noNormalBounds = false;
-               if (columnUpper[j] && columnUpper[j] < 1.0e20)
-                    noNormalBounds = false;
-          }
-     }
-     if (noNormalBounds)
-          gubType_ |= 8;
-     if (!gotBasis) {
-          for (iSet = 0; iSet < numberSets_; iSet++) {
-               CoinBigIndex j;
-               int numberBasic = 0;
-               int iBasic = -1;
-               CoinBigIndex iStart = start_[iSet];
-               CoinBigIndex iEnd = end_[iSet];
-               // find one with smallest length
-               int smallest = numberRows + 1;
-               double value = 0.0;
-               for (j = iStart; j < iEnd; j++) {
-                    if (model->getStatus(j) == ClpSimplex::basic) {
-                         if (columnLength[j] < smallest) {
-                              smallest = columnLength[j];
-                              iBasic = j;
-                         }
-                         numberBasic++;
-                    }
-                    value += columnSolution[j];
-               }
-               bool done = false;
-               if (numberBasic > 1 || (numberBasic == 1 && getStatus(iSet) == ClpSimplex::basic)) {
-                    if (getStatus(iSet) == ClpSimplex::basic)
-                         iBasic = iSet + numberColumns; // slack key - use
-                    done = true;
-               } else if (numberBasic == 1) {
-                    // see if can be key
-                    double thisSolution = columnSolution[iBasic];
-                    if (thisSolution > columnUpper[iBasic]) {
-                         value -= thisSolution - columnUpper[iBasic];
-                         thisSolution = columnUpper[iBasic];
-                         columnSolution[iBasic] = thisSolution;
-                    }
-                    if (thisSolution < columnLower[iBasic]) {
-                         value -= thisSolution - columnLower[iBasic];
-                         thisSolution = columnLower[iBasic];
-                         columnSolution[iBasic] = thisSolution;
-                    }
-                    // try setting slack to a bound
-                    assert (upper_[iSet] < 1.0e20 || lower_[iSet] > -1.0e20);
-                    double cost1 = COIN_DBL_MAX;
-                    int whichBound = -1;
-                    if (upper_[iSet] < 1.0e20) {
-                         // try slack at ub
-                         double newBasic = thisSolution + upper_[iSet] - value;
-                         if (newBasic >= columnLower[iBasic] - tolerance &&
-                                   newBasic <= columnUpper[iBasic] + tolerance) {
-                              // can go
-                              whichBound = 1;
-                              cost1 = newBasic * objective[iBasic];
-                              // But if exact then may be good solution
-                              if (fabs(upper_[iSet] - value) < tolerance)
-                                   cost1 = -COIN_DBL_MAX;
-                         }
-                    }
-                    if (lower_[iSet] > -1.0e20) {
-                         // try slack at lb
-                         double newBasic = thisSolution + lower_[iSet] - value;
-                         if (newBasic >= columnLower[iBasic] - tolerance &&
-                                   newBasic <= columnUpper[iBasic] + tolerance) {
-                              // can go but is it cheaper
-                              double cost2 = newBasic * objective[iBasic];
-                              // But if exact then may be good solution
-                              if (fabs(lower_[iSet] - value) < tolerance)
-                                   cost2 = -COIN_DBL_MAX;
-                              if (cost2 < cost1)
-                                   whichBound = 0;
-                         }
-                    }
-                    if (whichBound != -1) {
-                         // key
-                         done = true;
-                         if (whichBound) {
-                              // slack to upper
-                              columnSolution[iBasic] = thisSolution + upper_[iSet] - value;
-                              setStatus(iSet, ClpSimplex::atUpperBound);
-                         } else {
-                              // slack to lower
-                              columnSolution[iBasic] = thisSolution + lower_[iSet] - value;
-                              setStatus(iSet, ClpSimplex::atLowerBound);
-                         }
-                    }
-               }
-               if (!done) {
-                    if (!cheapest) {
-                         // see if slack can be key
-                         if (value >= lower_[iSet] - tolerance && value <= upper_[iSet] + tolerance) {
-                              done = true;
-                              setStatus(iSet, ClpSimplex::basic);
-                              iBasic = iSet + numberColumns;
-                         }
-                    }
-                    if (!done) {
-                         // set non basic if there was one
-                         if (iBasic >= 0)
-                              model->setStatus(iBasic, ClpSimplex::atLowerBound);
-                         // find cheapest
-                         int numberInSet = iEnd - iStart;
-                         CoinMemcpyN(columnLower + iStart, numberInSet, lower);
-                         CoinMemcpyN(columnUpper + iStart, numberInSet, upper);
-                         CoinMemcpyN(columnSolution + iStart, numberInSet, solution);
-                         // and slack
-                         iBasic = numberInSet;
-                         solution[iBasic] = -value;
-                         lower[iBasic] = -upper_[iSet];
-                         upper[iBasic] = -lower_[iSet];
-                         int kphase;
-                         if (value >= lower_[iSet] - tolerance && value <= upper_[iSet] + tolerance) {
-                              // feasible
-                              kphase = 1;
-                              cost[iBasic] = 0.0;
-                              CoinMemcpyN(objective + iStart, numberInSet, cost);
-                         } else {
-                              // infeasible
-                              kphase = 0;
-                              // remember bounds are flipped so opposite to natural
-                              if (value < lower_[iSet] - tolerance)
-                                   cost[iBasic] = 1.0;
-                              else
-                                   cost[iBasic] = -1.0;
-                              CoinZeroN(cost, numberInSet);
-                         }
-                         double dualTolerance = model->dualTolerance();
-                         for (int iphase = kphase; iphase < 2; iphase++) {
-                              if (iphase) {
-                                   cost[numberInSet] = 0.0;
-                                   CoinMemcpyN(objective + iStart, numberInSet, cost);
-                              }
-                              // now do one row lp
-                              bool improve = true;
-                              while (improve) {
-                                   improve = false;
-                                   double dual = cost[iBasic];
-                                   int chosen = -1;
-                                   double best = dualTolerance;
-                                   int way = 0;
-                                   for (int i = 0; i <= numberInSet; i++) {
-                                        double dj = cost[i] - dual;
-                                        double improvement = 0.0;
-                                        if (iphase || i < numberInSet)
-                                             assert (solution[i] >= lower[i] && solution[i] <= upper[i]);
-                                        if (dj > dualTolerance)
-                                             improvement = dj * (solution[i] - lower[i]);
-                                        else if (dj < -dualTolerance)
-                                             improvement = dj * (solution[i] - upper[i]);
-                                        if (improvement > best) {
-                                             best = improvement;
-                                             chosen = i;
-                                             if (dj < 0.0) {
-                                                  way = 1;
-                                             } else {
-                                                  way = -1;
-                                             }
-                                        }
-                                   }
-                                   if (chosen >= 0) {
-                                        improve = true;
-                                        // now see how far
-                                        if (way > 0) {
-                                             // incoming increasing so basic decreasing
-                                             // if phase 0 then go to nearest bound
-                                             double distance = upper[chosen] - solution[chosen];
-                                             double basicDistance;
-                                             if (!iphase) {
-                                                  assert (iBasic == numberInSet);
-                                                  assert (solution[iBasic] > upper[iBasic]);
-                                                  basicDistance = solution[iBasic] - upper[iBasic];
-                                             } else {
-                                                  basicDistance = solution[iBasic] - lower[iBasic];
-                                             }
-                                             // need extra coding for unbounded
-                                             assert (CoinMin(distance, basicDistance) < 1.0e20);
-                                             if (distance > basicDistance) {
-                                                  // incoming becomes basic
-                                                  solution[chosen] += basicDistance;
-                                                  if (!iphase)
-                                                       solution[iBasic] = upper[iBasic];
-                                                  else
-                                                       solution[iBasic] = lower[iBasic];
-                                                  iBasic = chosen;
-                                             } else {
-                                                  // flip
-                                                  solution[chosen] = upper[chosen];
-                                                  solution[iBasic] -= distance;
-                                             }
-                                        } else {
-                                             // incoming decreasing so basic increasing
-                                             // if phase 0 then go to nearest bound
-                                             double distance = solution[chosen] - lower[chosen];
-                                             double basicDistance;
-                                             if (!iphase) {
-                                                  assert (iBasic == numberInSet);
-                                                  assert (solution[iBasic] < lower[iBasic]);
-                                                  basicDistance = lower[iBasic] - solution[iBasic];
-                                             } else {
-                                                  basicDistance = upper[iBasic] - solution[iBasic];
-                                             }
-                                             // need extra coding for unbounded - for now just exit
-                                             if (CoinMin(distance, basicDistance) > 1.0e20) {
-                                                  printf("unbounded on set %d\n", iSet);
-                                                  iphase = 1;
-                                                  iBasic = numberInSet;
-                                                  break;
-                                             }
-                                             if (distance > basicDistance) {
-                                                  // incoming becomes basic
-                                                  solution[chosen] -= basicDistance;
-                                                  if (!iphase)
-                                                       solution[iBasic] = lower[iBasic];
-                                                  else
-                                                       solution[iBasic] = upper[iBasic];
-                                                  iBasic = chosen;
-                                             } else {
-                                                  // flip
-                                                  solution[chosen] = lower[chosen];
-                                                  solution[iBasic] += distance;
-                                             }
-                                        }
-                                        if (!iphase) {
-                                             if(iBasic < numberInSet)
-                                                  break; // feasible
-                                             else if (solution[iBasic] >= lower[iBasic] &&
-                                                       solution[iBasic] <= upper[iBasic])
-                                                  break; // feasible (on flip)
-                                        }
-                                   }
-                              }
-                         }
-                         // convert iBasic back and do bounds
-                         if (iBasic == numberInSet) {
-                              // slack basic
-                              setStatus(iSet, ClpSimplex::basic);
-                              iBasic = iSet + numberColumns;
-                         } else {
-                              iBasic += start_[iSet];
-                              model->setStatus(iBasic, ClpSimplex::basic);
-                              // remember bounds flipped
-                              if (upper[numberInSet] == lower[numberInSet])
-                                   setStatus(iSet, ClpSimplex::isFixed);
-                              else if (solution[numberInSet] == upper[numberInSet])
-                                   setStatus(iSet, ClpSimplex::atLowerBound);
-                              else if (solution[numberInSet] == lower[numberInSet])
-                                   setStatus(iSet, ClpSimplex::atUpperBound);
-                              else
-                                   abort();
-                         }
-                         for (j = iStart; j < iEnd; j++) {
-                              if (model->getStatus(j) != ClpSimplex::basic) {
-                                   int inSet = j - iStart;
-                                   columnSolution[j] = solution[inSet];
-                                   if (upper[inSet] == lower[inSet])
-                                        model->setStatus(j, ClpSimplex::isFixed);
-                                   else if (solution[inSet] == upper[inSet])
-                                        model->setStatus(j, ClpSimplex::atUpperBound);
-                                   else if (solution[inSet] == lower[inSet])
-                                        model->setStatus(j, ClpSimplex::atLowerBound);
-                              }
-                         }
-                    }
-               }
-               keyVariable_[iSet] = iBasic;
-          }
-     }
-     delete [] lower;
-     delete [] solution;
-     delete [] upper;
-     delete [] cost;
-     // make sure matrix is in good shape
-     matrix_->orderMatrix();
-     // create effective rhs
-     delete [] rhsOffset_;
-     rhsOffset_ = new double[numberRows];
-     delete [] next_;
-     next_ = new int[numberColumns+numberSets_+2*longestSet];
-     char * mark = new char[numberColumns];
-     memset(mark, 0, numberColumns);
-     for (int iColumn = 0; iColumn < numberColumns; iColumn++)
-          next_[iColumn] = COIN_INT_MAX;
-     int i;
-     int * keys = new int[numberSets_];
-     for (i = 0; i < numberSets_; i++)
-          keys[i] = COIN_INT_MAX;
-     // set up chains
-     for (i = 0; i < numberColumns; i++) {
-          if (model->getStatus(i) == ClpSimplex::basic)
-               mark[i] = 1;
-          int iSet = backward_[i];
-          if (iSet >= 0) {
-               int iNext = keys[iSet];
-               next_[i] = iNext;
-               keys[iSet] = i;
-          }
-     }
-     for (i = 0; i < numberSets_; i++) {
-          int j;
-          if (getStatus(i) != ClpSimplex::basic) {
-               // make sure fixed if it is
-               if (upper_[i] == lower_[i])
-                    setStatus(i, ClpSimplex::isFixed);
-               // slack not key - choose one with smallest length
-               int smallest = numberRows + 1;
-               int key = -1;
-               j = keys[i];
-               if (j != COIN_INT_MAX) {
-                    while (1) {
-                         if (mark[j] && columnLength[j] < smallest && !gotBasis) {
-                              key = j;
-                              smallest = columnLength[j];
-                         }
-                         if (next_[j] != COIN_INT_MAX) {
-                              j = next_[j];
-                         } else {
-                              // correct end
-                              next_[j] = -(keys[i] + 1);
-                              break;
-                         }
-                    }
-               } else {
-                    next_[i+numberColumns] = -(numberColumns + i + 1);
-               }
-               if (gotBasis)
-                    key = keyVariable_[i];
-               if (key >= 0) {
-                    keyVariable_[i] = key;
-               } else {
-                    // nothing basic - make slack key
-                    //((ClpGubMatrix *)this)->setStatus(i,ClpSimplex::basic);
-                    // fudge to avoid const problem
-                    status_[i] = 1;
-               }
-          } else {
-               // slack key
-               keyVariable_[i] = numberColumns + i;
-               int j;
-               double sol = 0.0;
-               j = keys[i];
-               if (j != COIN_INT_MAX) {
-                    while (1) {
-                         sol += columnSolution[j];
-                         if (next_[j] != COIN_INT_MAX) {
-                              j = next_[j];
-                         } else {
-                              // correct end
-                              next_[j] = -(keys[i] + 1);
-                              break;
-                         }
-                    }
-               } else {
-                    next_[i+numberColumns] = -(numberColumns + i + 1);
-               }
-               if (sol > upper_[i] + tolerance) {
-                    setAbove(i);
-               } else if (sol < lower_[i] - tolerance) {
-                    setBelow(i);
-               } else {
-                    setFeasible(i);
-               }
-          }
-          // Create next_
-          int key = keyVariable_[i];
-          redoSet(model, key, keys[i], i);
-     }
-     delete [] keys;
-     delete [] mark;
-     rhsOffset(model, true);
-}
-// redoes next_ for a set.
-void
-ClpGubMatrix::redoSet(ClpSimplex * model, int newKey, int oldKey, int iSet)
-{
-     int numberColumns = model->numberColumns();
-     int * save = next_ + numberColumns + numberSets_;
-     int number = 0;
-     int stop = -(oldKey + 1);
-     int j = next_[oldKey];
-     while (j != stop) {
-          if (j < 0)
-               j = -j - 1;
-          if (j != newKey)
-               save[number++] = j;
-          j = next_[j];
-     }
-     // and add oldkey
-     if (newKey != oldKey)
-          save[number++] = oldKey;
-     // now do basic
-     int lastMarker = -(newKey + 1);
-     keyVariable_[iSet] = newKey;
-     next_[newKey] = lastMarker;
-     int last = newKey;
-     for ( j = 0; j < number; j++) {
-          int iColumn = save[j];
-          if (iColumn < numberColumns) {
-               if (model->getStatus(iColumn) == ClpSimplex::basic) {
-                    next_[last] = iColumn;
-                    next_[iColumn] = lastMarker;
-                    last = iColumn;
-               }
-          }
-     }
-     // now add in non-basic
-     for ( j = 0; j < number; j++) {
-          int iColumn = save[j];
-          if (iColumn < numberColumns) {
-               if (model->getStatus(iColumn) != ClpSimplex::basic) {
-                    next_[last] = -(iColumn + 1);
-                    next_[iColumn] = lastMarker;
-                    last = iColumn;
-               }
-          }
-     }
-
-}
-/* Returns effective RHS if it is being used.  This is used for long problems
-   or big gub or anywhere where going through full columns is
-   expensive.  This may re-compute */
-double *
-ClpGubMatrix::rhsOffset(ClpSimplex * model, bool forceRefresh, bool
-#ifdef CLP_DEBUG
-                        check
-#endif
-                       )
-{
-     //forceRefresh=true;
-     if (rhsOffset_) {
-#ifdef CLP_DEBUG
-          if (check) {
-               // no need - but check anyway
-               // zero out basic
-               int numberRows = model->numberRows();
-               int numberColumns = model->numberColumns();
-               double * solution = new double [numberColumns];
-               double * rhs = new double[numberRows];
-               CoinMemcpyN(model->solutionRegion(), numberColumns, solution);
-               CoinZeroN(rhs, numberRows);
-               int iRow;
-               for (int iColumn = 0; iColumn < numberColumns; iColumn++) {
-                    if (model->getColumnStatus(iColumn) == ClpSimplex::basic)
-                         solution[iColumn] = 0.0;
-               }
-               for (int iSet = 0; iSet < numberSets_; iSet++) {
-                    int iColumn = keyVariable_[iSet];
-                    if (iColumn < numberColumns)
-                         solution[iColumn] = 0.0;
-               }
-               times(-1.0, solution, rhs);
-               delete [] solution;
-               const double * columnSolution = model->solutionRegion();
-               // and now subtract out non basic
-               ClpSimplex::Status iStatus;
-               for (int iSet = 0; iSet < numberSets_; iSet++) {
-                    int iColumn = keyVariable_[iSet];
-                    if (iColumn < numberColumns) {
-                         double b = 0.0;
-                         // key is structural - where is slack
-                         iStatus = getStatus(iSet);
-                         assert (iStatus != ClpSimplex::basic);
-                         if (iStatus == ClpSimplex::atLowerBound)
-                              b = lower_[iSet];
-                         else
-                              b = upper_[iSet];
-                         // subtract out others at bounds
-                         if ((gubType_ & 8) == 0) {
-                              int stop = -(iColumn + 1);
-                              int jColumn = next_[iColumn];
-                              // sum all non-basic variables - first skip basic
-                              while(jColumn >= 0)
-                                   jColumn = next_[jColumn];
-                              while(jColumn != stop) {
-                                   assert (jColumn < 0);
-                                   jColumn = -jColumn - 1;
-                                   b -= columnSolution[jColumn];
-                                   jColumn = next_[jColumn];
-                              }
-                         }
-                         // subtract out
-                         ClpPackedMatrix::add(model, rhs, iColumn, -b);
-                    }
-               }
-               for (iRow = 0; iRow < numberRows; iRow++) {
-                    if (fabs(rhs[iRow] - rhsOffset_[iRow]) > 1.0e-3)
-                         printf("** bad effective %d - true %g old %g\n", iRow, rhs[iRow], rhsOffset_[iRow]);
-               }
-               delete [] rhs;
-          }
-#endif
-          if (forceRefresh || (refreshFrequency_ && model->numberIterations() >=
-                               lastRefresh_ + refreshFrequency_)) {
-               // zero out basic
-               int numberRows = model->numberRows();
-               int numberColumns = model->numberColumns();
-               double * solution = new double [numberColumns];
-               CoinMemcpyN(model->solutionRegion(), numberColumns, solution);
-               CoinZeroN(rhsOffset_, numberRows);
-               for (int iColumn = 0; iColumn < numberColumns; iColumn++) {
-                    if (model->getColumnStatus(iColumn) == ClpSimplex::basic)
-                         solution[iColumn] = 0.0;
-               }
-               int iSet;
-               for ( iSet = 0; iSet < numberSets_; iSet++) {
-                    int iColumn = keyVariable_[iSet];
-                    if (iColumn < numberColumns)
-                         solution[iColumn] = 0.0;
-               }
-               times(-1.0, solution, rhsOffset_);
-               delete [] solution;
-               lastRefresh_ = model->numberIterations();
-               const double * columnSolution = model->solutionRegion();
-               // and now subtract out non basic
-               ClpSimplex::Status iStatus;
-               for ( iSet = 0; iSet < numberSets_; iSet++) {
-                    int iColumn = keyVariable_[iSet];
-                    if (iColumn < numberColumns) {
-                         double b = 0.0;
-                         // key is structural - where is slack
-                         iStatus = getStatus(iSet);
-                         assert (iStatus != ClpSimplex::basic);
-                         if (iStatus == ClpSimplex::atLowerBound)
-                              b = lower_[iSet];
-                         else
-                              b = upper_[iSet];
-                         // subtract out others at bounds
-                         if ((gubType_ & 8) == 0) {
-                              int stop = -(iColumn + 1);
-                              int jColumn = next_[iColumn];
-                              // sum all non-basic variables - first skip basic
-                              while(jColumn >= 0)
-                                   jColumn = next_[jColumn];
-                              while(jColumn != stop) {
-                                   assert (jColumn < 0);
-                                   jColumn = -jColumn - 1;
-                                   b -= columnSolution[jColumn];
-                                   jColumn = next_[jColumn];
-                              }
-                         }
-                         // subtract out
-                         if (b)
-                              ClpPackedMatrix::add(model, rhsOffset_, iColumn, -b);
-                    }
-               }
-          }
-     }
-     return rhsOffset_;
-}
-/*
-   update information for a pivot (and effective rhs)
-*/
-int
-ClpGubMatrix::updatePivot(ClpSimplex * model, double oldInValue, double /*oldOutValue*/)
-{
-     int sequenceIn = model->sequenceIn();
-     int sequenceOut = model->sequenceOut();
-     double * solution = model->solutionRegion();
-     int numberColumns = model->numberColumns();
-     int numberRows = model->numberRows();
-     int pivotRow = model->pivotRow();
-     int iSetIn;
-     // Correct sequence in
-     trueSequenceIn_ = sequenceIn;
-     if (sequenceIn < numberColumns) {
-          iSetIn = backward_[sequenceIn];
-     } else if (sequenceIn < numberColumns + numberRows) {
-          iSetIn = -1;
-     } else {
-          iSetIn = gubSlackIn_;
-          trueSequenceIn_ = numberColumns + numberRows + iSetIn;
-     }
-     int iSetOut = -1;
-     trueSequenceOut_ = sequenceOut;
-     if (sequenceOut < numberColumns) {
-          iSetOut = backward_[sequenceOut];
-     } else if (sequenceOut >= numberRows + numberColumns) {
-          assert (pivotRow >= numberRows);
-          int iExtra = pivotRow - numberRows;
-          assert (iExtra >= 0);
-          if (iSetOut < 0)
-               iSetOut = fromIndex_[iExtra];
-          else
-               assert(iSetOut == fromIndex_[iExtra]);
-          trueSequenceOut_ = numberColumns + numberRows + iSetOut;
-     }
-     if (rhsOffset_) {
-          // update effective rhs
-          if (sequenceIn == sequenceOut) {
-               assert (sequenceIn < numberRows + numberColumns); // should be easy to deal with
-               if (sequenceIn < numberColumns)
-                    add(model, rhsOffset_, sequenceIn, oldInValue - solution[sequenceIn]);
-          } else {
-               if (sequenceIn < numberColumns) {
-                    // we need to test if WILL be key
-                    ClpPackedMatrix::add(model, rhsOffset_, sequenceIn, oldInValue);
-                    if (iSetIn >= 0)  {
-                         // old contribution to rhsOffset_
-                         int key = keyVariable_[iSetIn];
-                         if (key < numberColumns) {
-                              double oldB = 0.0;
-                              ClpSimplex::Status iStatus = getStatus(iSetIn);
-                              if (iStatus == ClpSimplex::atLowerBound)
-                                   oldB = lower_[iSetIn];
-                              else
-                                   oldB = upper_[iSetIn];
-                              // subtract out others at bounds
-                              if ((gubType_ & 8) == 0) {
-                                   int stop = -(key + 1);
-                                   int iColumn = next_[key];
-                                   // skip basic
-                                   while (iColumn >= 0)
-                                        iColumn = next_[iColumn];
-                                   // sum all non-key variables
-                                   while(iColumn != stop) {
-                                        assert (iColumn < 0);
-                                        iColumn = -iColumn - 1;
-                                        if (iColumn == sequenceIn)
-                                             oldB -= oldInValue;
-                                        else if ( iColumn != sequenceOut )
-                                             oldB -= solution[iColumn];
-                                        iColumn = next_[iColumn];
-                                   }
-                              }
-                              if (oldB)
-                                   ClpPackedMatrix::add(model, rhsOffset_, key, oldB);
-                         }
-                    }
-               } else if (sequenceIn < numberRows + numberColumns) {
-                    //rhsOffset_[sequenceIn-numberColumns] -= oldInValue;
-               } else {
-#ifdef CLP_DEBUG_PRINT
-                    printf("** in is key slack %d\n", sequenceIn);
-#endif
-                    // old contribution to rhsOffset_
-                    int key = keyVariable_[iSetIn];
-                    if (key < numberColumns) {
-                         double oldB = 0.0;
-                         ClpSimplex::Status iStatus = getStatus(iSetIn);
-                         if (iStatus == ClpSimplex::atLowerBound)
-                              oldB = lower_[iSetIn];
-                         else
-                              oldB = upper_[iSetIn];
-                         // subtract out others at bounds
-                         if ((gubType_ & 8) == 0) {
-                              int stop = -(key + 1);
-                              int iColumn = next_[key];
-                              // skip basic
-                              while (iColumn >= 0)
-                                   iColumn = next_[iColumn];
-                              // sum all non-key variables
-                              while(iColumn != stop) {
-                                   assert (iColumn < 0);
-                                   iColumn = -iColumn - 1;
-                                   if ( iColumn != sequenceOut )
-                                        oldB -= solution[iColumn];
-                                   iColumn = next_[iColumn];
-                              }
-                         }
-                         if (oldB)
-                              ClpPackedMatrix::add(model, rhsOffset_, key, oldB);
-                    }
-               }
-               if (sequenceOut < numberColumns) {
-                    ClpPackedMatrix::add(model, rhsOffset_, sequenceOut, -solution[sequenceOut]);
-                    if (iSetOut >= 0) {
-                         // old contribution to rhsOffset_
-                         int key = keyVariable_[iSetOut];
-                         if (key < numberColumns && iSetIn != iSetOut) {
-                              double oldB = 0.0;
-                              ClpSimplex::Status iStatus = getStatus(iSetOut);
-                              if (iStatus == ClpSimplex::atLowerBound)
-                                   oldB = lower_[iSetOut];
-                              else
-                                   oldB = upper_[iSetOut];
-                              // subtract out others at bounds
-                              if ((gubType_ & 8) == 0) {
-                                   int stop = -(key + 1);
-                                   int iColumn = next_[key];
-                                   // skip basic
-                                   while (iColumn >= 0)
-                                        iColumn = next_[iColumn];
-                                   // sum all non-key variables
-                                   while(iColumn != stop) {
-                                        assert (iColumn < 0);
-                                        iColumn = -iColumn - 1;
-                                        if (iColumn == sequenceIn)
-                                             oldB -= oldInValue;
-                                        else if ( iColumn != sequenceOut )
-                                             oldB -= solution[iColumn];
-                                        iColumn = next_[iColumn];
-                                   }
-                              }
-                              if (oldB)
-                                   ClpPackedMatrix::add(model, rhsOffset_, key, oldB);
-                         }
-                    }
-               } else if (sequenceOut < numberRows + numberColumns) {
-                    //rhsOffset_[sequenceOut-numberColumns] -= -solution[sequenceOut];
-               } else {
-#ifdef CLP_DEBUG_PRINT
-                    printf("** out is key slack %d\n", sequenceOut);
-#endif
-                    assert (pivotRow >= numberRows);
-               }
-          }
-     }
-     int * pivotVariable = model->pivotVariable();
-     // may need to deal with key
-     // Also need coding to mark/allow key slack entering
-     if (pivotRow >= numberRows) {
-          assert (sequenceOut >= numberRows + numberColumns || sequenceOut == keyVariable_[iSetOut]);
-#ifdef CLP_DEBUG_PRINT
-          if (sequenceIn >= numberRows + numberColumns)
-               printf("key slack %d in, set out %d\n", gubSlackIn_, iSetOut);
-          printf("** danger - key out for set %d in %d (set %d)\n", iSetOut, sequenceIn,
-                 iSetIn);
-#endif
-          // if slack out mark correctly
-          if (sequenceOut >= numberRows + numberColumns) {
-               double value = model->valueOut();
-               if (value == upper_[iSetOut]) {
-                    setStatus(iSetOut, ClpSimplex::atUpperBound);
-               } else if (value == lower_[iSetOut]) {
-                    setStatus(iSetOut, ClpSimplex::atLowerBound);
-               } else {
-                    if (fabs(value - upper_[iSetOut]) <
-                              fabs(value - lower_[iSetOut])) {
-                         setStatus(iSetOut, ClpSimplex::atUpperBound);
-                    } else {
-                         setStatus(iSetOut, ClpSimplex::atLowerBound);
-                    }
-               }
-               if (upper_[iSetOut] == lower_[iSetOut])
-                    setStatus(iSetOut, ClpSimplex::isFixed);
-               setFeasible(iSetOut);
-          }
-          if (iSetOut == iSetIn) {
-               // key swap
-               int key;
-               if (sequenceIn >= numberRows + numberColumns) {
-                    key = numberColumns + iSetIn;
-                    setStatus(iSetIn, ClpSimplex::basic);
-               } else {
-                    key = sequenceIn;
-               }
-               redoSet(model, key, keyVariable_[iSetIn], iSetIn);
-          } else {
-               // key was chosen
-               assert (possiblePivotKey_ >= 0 && possiblePivotKey_ < numberRows);
-               int key = pivotVariable[possiblePivotKey_];
-               // and set incoming here
-               if (sequenceIn >= numberRows + numberColumns) {
-                    // slack in - so use old key
-                    sequenceIn = keyVariable_[iSetIn];
-                    model->setStatus(sequenceIn, ClpSimplex::basic);
-                    setStatus(iSetIn, ClpSimplex::basic);
-                    redoSet(model, iSetIn + numberColumns, keyVariable_[iSetIn], iSetIn);
-               }
-               //? do not do if iSetIn<0 ? as will be done later
-               pivotVariable[possiblePivotKey_] = sequenceIn;
-               if (sequenceIn < numberColumns)
-                    backToPivotRow_[sequenceIn] = possiblePivotKey_;
-               redoSet(model, key, keyVariable_[iSetOut], iSetOut);
-          }
-     } else {
-          if (sequenceOut < numberColumns) {
-               if (iSetIn >= 0 && iSetOut == iSetIn) {
-                    // key not out - only problem is if slack in
-                    int key;
-                    if (sequenceIn >= numberRows + numberColumns) {
-                         key = numberColumns + iSetIn;
-                         setStatus(iSetIn, ClpSimplex::basic);
-                         assert (pivotRow < numberRows);
-                         // must swap with current key
-                         int key = keyVariable_[iSetIn];
-                         model->setStatus(key, ClpSimplex::basic);
-                         pivotVariable[pivotRow] = key;
-                         backToPivotRow_[key] = pivotRow;
-                    } else {
-                         key = keyVariable_[iSetIn];
-                    }
-                    redoSet(model, key, keyVariable_[iSetIn], iSetIn);
-               } else if (iSetOut >= 0) {
-                    // just redo set
-                    int key = keyVariable_[iSetOut];;
-                    redoSet(model, key, keyVariable_[iSetOut], iSetOut);
-               }
-          }
-     }
-     if (iSetIn >= 0 && iSetIn != iSetOut) {
-          int key = keyVariable_[iSetIn];
-          if (sequenceIn == numberColumns + 2 * numberRows) {
-               // key slack in
-               assert (pivotRow < numberRows);
-               // must swap with current key
-               model->setStatus(key, ClpSimplex::basic);
-               pivotVariable[pivotRow] = key;
-               backToPivotRow_[key] = pivotRow;
-               setStatus(iSetIn, ClpSimplex::basic);
-               key = iSetIn + numberColumns;
-          }
-          // redo set to allow for new one
-          redoSet(model, key, keyVariable_[iSetIn], iSetIn);
-     }
-     // update pivot
-     if (sequenceIn < numberColumns) {
-          if (pivotRow < numberRows) {
-               backToPivotRow_[sequenceIn] = pivotRow;
-          } else {
-               if (possiblePivotKey_ >= 0) {
-                    assert (possiblePivotKey_ < numberRows);
-                    backToPivotRow_[sequenceIn] = possiblePivotKey_;
-                    pivotVariable[possiblePivotKey_] = sequenceIn;
-               }
-          }
-     } else if (sequenceIn >= numberRows + numberColumns) {
-          // key in - something should have been done before
-          int key = keyVariable_[iSetIn];
-          assert (key == numberColumns + iSetIn);
-          //pivotVariable[pivotRow]=key;
-          //backToPivotRow_[key]=pivotRow;
-          //model->setStatus(key,ClpSimplex::basic);
-          //key=numberColumns+iSetIn;
-          setStatus(iSetIn, ClpSimplex::basic);
-          redoSet(model, key, keyVariable_[iSetIn], iSetIn);
-     }
-#ifdef CLP_DEBUG
-     {
-          char * xx = new char[numberColumns+numberRows];
-          memset(xx, 0, numberRows + numberColumns);
-          for (int i = 0; i < numberRows; i++) {
-               int iPivot = pivotVariable[i];
-               assert (iPivot < numberRows + numberColumns);
-               assert (!xx[iPivot]);
-               xx[iPivot] = 1;
-               if (iPivot < numberColumns) {
-                    int iBack = backToPivotRow_[iPivot];
-                    assert (i == iBack);
-               }
-          }
-          delete [] xx;
-     }
-#endif
-     if (rhsOffset_) {
-          // update effective rhs
-          if (sequenceIn != sequenceOut) {
-               if (sequenceIn < numberColumns) {
-                    if (iSetIn >= 0) {
-                         // new contribution to rhsOffset_
-                         int key = keyVariable_[iSetIn];
-                         if (key < numberColumns) {
-                              double newB = 0.0;
-                              ClpSimplex::Status iStatus = getStatus(iSetIn);
-                              if (iStatus == ClpSimplex::atLowerBound)
-                                   newB = lower_[iSetIn];
-                              else
-                                   newB = upper_[iSetIn];
-                              // subtract out others at bounds
-                              if ((gubType_ & 8) == 0) {
-                                   int stop = -(key + 1);
-                                   int iColumn = next_[key];
-                                   // skip basic
-                                   while (iColumn >= 0)
-                                        iColumn = next_[iColumn];
-                                   // sum all non-key variables
-                                   while(iColumn != stop) {
-                                        assert (iColumn < 0);
-                                        iColumn = -iColumn - 1;
-                                        newB -= solution[iColumn];
-                                        iColumn = next_[iColumn];
-                                   }
-                              }
-                              if (newB)
-                                   ClpPackedMatrix::add(model, rhsOffset_, key, -newB);
-                         }
-                    }
-               }
-               if (iSetOut >= 0) {
-                    // new contribution to rhsOffset_
-                    int key = keyVariable_[iSetOut];
-                    if (key < numberColumns && iSetIn != iSetOut) {
-                         double newB = 0.0;
-                         ClpSimplex::Status iStatus = getStatus(iSetOut);
-                         if (iStatus == ClpSimplex::atLowerBound)
-                              newB = lower_[iSetOut];
-                         else
-                              newB = upper_[iSetOut];
-                         // subtract out others at bounds
-                         if ((gubType_ & 8) == 0) {
-                              int stop = -(key + 1);
-                              int iColumn = next_[key];
-                              // skip basic
-                              while (iColumn >= 0)
-                                   iColumn = next_[iColumn];
-                              // sum all non-key variables
-                              while(iColumn != stop) {
-                                   assert (iColumn < 0);
-                                   iColumn = -iColumn - 1;
-                                   newB -= solution[iColumn];
-                                   iColumn = next_[iColumn];
-                              }
-                         }
-                         if (newB)
-                              ClpPackedMatrix::add(model, rhsOffset_, key, -newB);
-                    }
-               }
-          }
-     }
-#ifdef CLP_DEBUG
-     // debug
-     {
-          int i;
-          char * xxxx = new char[numberColumns];
-          memset(xxxx, 0, numberColumns);
-          for (i = 0; i < numberRows; i++) {
-               int iPivot = pivotVariable[i];
-               assert (model->getStatus(iPivot) == ClpSimplex::basic);
-               if (iPivot < numberColumns && backward_[iPivot] >= 0)
-                    xxxx[iPivot] = 1;
-          }
-          double primalTolerance = model->primalTolerance();
-          for (i = 0; i < numberSets_; i++) {
-               int key = keyVariable_[i];
-               double value = 0.0;
-               // sum over all except key
-               int iColumn = next_[key];
-               // sum all non-key variables
-               int k = 0;
-               int stop = -(key + 1);
-               while (iColumn != stop) {
-                    if (iColumn < 0)
-                         iColumn = -iColumn - 1;
-                    value += solution[iColumn];
-                    k++;
-                    assert (k < 100);
-                    assert (backward_[iColumn] == i);
-                    iColumn = next_[iColumn];
-               }
-               iColumn = next_[key];
-               if (key < numberColumns) {
-                    // feasibility will be done later
-                    assert (getStatus(i) != ClpSimplex::basic);
-                    double sol;
-                    if (getStatus(i) == ClpSimplex::atUpperBound)
-                         sol = upper_[i] - value;
-                    else
-                         sol = lower_[i] - value;
-                    //printf("xx Value of key structural %d for set %d is %g - cost %g\n",key,i,sol,
-                    //     cost[key]);
-                    //if (fabs(sol-solution[key])>1.0e-3)
-                    //printf("** stored value was %g\n",solution[key]);
-               } else {
-                    // slack is key
-                    double infeasibility = 0.0;
-                    if (value > upper_[i] + primalTolerance) {
-                         infeasibility = value - upper_[i] - primalTolerance;
-                         //setAbove(i);
-                    } else if (value < lower_[i] - primalTolerance) {
-                         infeasibility = lower_[i] - value - primalTolerance ;
-                         //setBelow(i);
-                    } else {
-                         //setFeasible(i);
-                    }
-                    //printf("xx Value of key slack for set %d is %g\n",i,value);
-               }
-               while (iColumn >= 0) {
-                    assert (xxxx[iColumn]);
-                    xxxx[iColumn] = 0;
-                    iColumn = next_[iColumn];
-               }
-          }
-          for (i = 0; i < numberColumns; i++) {
-               if (i < numberColumns && backward_[i] >= 0) {
-                    assert (!xxxx[i] || i == keyVariable_[backward_[i]]);
-               }
-          }
-          delete [] xxxx;
-     }
-#endif
-     return 0;
-}
-// Switches off dj checking each factorization (for BIG models)
-void
-ClpGubMatrix::switchOffCheck()
-{
-     noCheck_ = 0;
-     infeasibilityWeight_ = 0.0;
-}
-// Correct sequence in and out to give true value
-void
-ClpGubMatrix::correctSequence(const ClpSimplex * /*model*/, int & sequenceIn, int & sequenceOut)
-{
-     if (sequenceIn != -999) {
-          sequenceIn = trueSequenceIn_;
-          sequenceOut = trueSequenceOut_;
-     }
-}
diff --git a/cbits/coin/Clp_C_Interface.cpp b/cbits/coin/Clp_C_Interface.cpp
deleted file mode 100644
--- a/cbits/coin/Clp_C_Interface.cpp
+++ /dev/null
@@ -1,1323 +0,0 @@
-// $Id: Clp_C_Interface.cpp 1928 2013-04-06 12:54:16Z stefan $
-// Copyright (C) 2003, International Business Machines
-// Corporation and others.  All Rights Reserved.
-// This code is licensed under the terms of the Eclipse Public License (EPL).
-
-
-#include "CoinPragma.hpp"
-
-#include <cmath>
-#include <cstring>
-
-#include "CoinHelperFunctions.hpp"
-#include "ClpSimplex.hpp"
-#include "ClpInterior.hpp"
-#ifndef SLIM_CLP
-#include "Idiot.hpp"
-#endif
-#include <cfloat>
-// Get C stuff but with extern C
-#define CLP_EXTERN_C
-#include "Coin_C_defines.h"
-
-/// To allow call backs
-class CMessageHandler : public CoinMessageHandler {
-
-public:
-     /**@name Overrides */
-     //@{
-     virtual int print();
-     //@}
-     /**@name set and get */
-     //@{
-     /// Model
-     const Clp_Simplex * model() const;
-     void setModel(Clp_Simplex * model);
-     /// Call back
-     void setCallBack(clp_callback callback);
-     //@}
-
-     /**@name Constructors, destructor */
-     //@{
-     /** Default constructor. */
-     CMessageHandler();
-     /// Constructor with pointer to model
-     CMessageHandler(Clp_Simplex * model,
-                     FILE * userPointer = NULL);
-     /** Destructor */
-     virtual ~CMessageHandler();
-     //@}
-
-     /**@name Copy method */
-     //@{
-     /** The copy constructor. */
-     CMessageHandler(const CMessageHandler&);
-     /** The copy constructor from an CoinSimplexMessageHandler. */
-     CMessageHandler(const CoinMessageHandler&);
-
-     CMessageHandler& operator=(const CMessageHandler&);
-     /// Clone
-     virtual CoinMessageHandler * clone() const ;
-     //@}
-
-
-protected:
-     /**@name Data members
-        The data members are protected to allow access for derived classes. */
-     //@{
-     /// Pointer back to model
-     Clp_Simplex * model_;
-     /// call back
-     clp_callback callback_;
-     //@}
-};
-
-
-//-------------------------------------------------------------------
-// Default Constructor
-//-------------------------------------------------------------------
-CMessageHandler::CMessageHandler ()
-     : CoinMessageHandler(),
-       model_(NULL),
-       callback_(NULL)
-{
-}
-
-//-------------------------------------------------------------------
-// Copy constructor
-//-------------------------------------------------------------------
-CMessageHandler::CMessageHandler (const CMessageHandler & rhs)
-     : CoinMessageHandler(rhs),
-       model_(rhs.model_),
-       callback_(rhs.callback_)
-{
-}
-
-CMessageHandler::CMessageHandler (const CoinMessageHandler & rhs)
-     : CoinMessageHandler(rhs),
-       model_(NULL),
-       callback_(NULL)
-{
-}
-
-// Constructor with pointer to model
-CMessageHandler::CMessageHandler(Clp_Simplex * model,
-                                 FILE * )
-     : CoinMessageHandler(),
-       model_(model),
-       callback_(NULL)
-{
-}
-
-//-------------------------------------------------------------------
-// Destructor
-//-------------------------------------------------------------------
-CMessageHandler::~CMessageHandler ()
-{
-}
-
-//----------------------------------------------------------------
-// Assignment operator
-//-------------------------------------------------------------------
-CMessageHandler &
-CMessageHandler::operator=(const CMessageHandler& rhs)
-{
-     if (this != &rhs) {
-          CoinMessageHandler::operator=(rhs);
-          model_ = rhs.model_;
-          callback_ = rhs.callback_;
-     }
-     return *this;
-}
-//-------------------------------------------------------------------
-// Clone
-//-------------------------------------------------------------------
-CoinMessageHandler * CMessageHandler::clone() const
-{
-     return new CMessageHandler(*this);
-}
-
-int
-CMessageHandler::print()
-{
-     if (callback_) {
-          int messageNumber = currentMessage().externalNumber();
-          if (currentSource() != "Clp")
-               messageNumber += 1000000;
-          int i;
-          int nDouble = numberDoubleFields();
-          assert (nDouble <= 10);
-          double vDouble[10];
-          for (i = 0; i < nDouble; i++)
-               vDouble[i] = doubleValue(i);
-          int nInt = numberIntFields();
-          assert (nInt <= 10);
-          int vInt[10];
-          for (i = 0; i < nInt; i++)
-               vInt[i] = intValue(i);
-          int nString = numberStringFields();
-          assert (nString <= 10);
-          char * vString[10];
-          for (i = 0; i < nString; i++) {
-               std::string value = stringValue(i);
-               vString[i] = CoinStrdup(value.c_str());
-          }
-          callback_(model_, messageNumber,
-                    nDouble, vDouble,
-                    nInt, vInt,
-                    nString, vString);
-          for (i = 0; i < nString; i++)
-               free(vString[i]);
-
-     }
-     return CoinMessageHandler::print();
-}
-const Clp_Simplex *
-CMessageHandler::model() const
-{
-     return model_;
-}
-void
-CMessageHandler::setModel(Clp_Simplex * model)
-{
-     model_ = model;
-}
-// Call back
-void
-CMessageHandler::setCallBack(clp_callback callback)
-{
-     callback_ = callback;
-}
-
-#include "Clp_C_Interface.h"
-#include <string>
-#include <stdio.h>
-#include <iostream>
-
-#if defined(__MWERKS__)
-#pragma export on
-#endif
-/* Default constructor */
-COINLIBAPI Clp_Simplex *  COINLINKAGE
-Clp_newModel()
-{
-     Clp_Simplex * model = new Clp_Simplex;
-     model->model_ = new ClpSimplex();
-     model->handler_ = NULL;
-     return model;
-}
-/* Destructor */
-COINLIBAPI void COINLINKAGE
-Clp_deleteModel(Clp_Simplex * model)
-{
-     delete model->model_;
-     delete model->handler_;
-     delete model;
-}
-
-/* Loads a problem (the constraints on the
-    rows are given by lower and upper bounds). If a pointer is NULL then the
-    following values are the default:
-    <ul>
-    <li> <code>colub</code>: all columns have upper bound infinity
-    <li> <code>collb</code>: all columns have lower bound 0
-    <li> <code>rowub</code>: all rows have upper bound infinity
-    <li> <code>rowlb</code>: all rows have lower bound -infinity
-    <li> <code>obj</code>: all variables have 0 objective coefficient
-    </ul>
-*/
-/* Just like the other loadProblem() method except that the matrix is
-   given in a standard column major ordered format (without gaps). */
-COINLIBAPI void COINLINKAGE
-Clp_loadProblem (Clp_Simplex * model,  const int numcols, const int numrows,
-                 const CoinBigIndex * start, const int* index,
-                 const double* value,
-                 const double* collb, const double* colub,
-                 const double* obj,
-                 const double* rowlb, const double* rowub)
-{
-     const char prefix[] = "Clp_c_Interface::Clp_loadProblem(): ";
-     const int  verbose = 0;
-     if (verbose > 1) {
-          printf("%s numcols = %i, numrows = %i\n",
-                 prefix, numcols, numrows);
-          printf("%s model = %p, start = %p, index = %p, value = %p\n",
-                 prefix, reinterpret_cast<const void *>(model), reinterpret_cast<const void *>(start), reinterpret_cast<const void *>(index), reinterpret_cast<const void *>(value));
-          printf("%s collb = %p, colub = %p, obj = %p, rowlb = %p, rowub = %p\n",
-                 prefix, reinterpret_cast<const void *>(collb), reinterpret_cast<const void *>(colub), reinterpret_cast<const void *>(obj), reinterpret_cast<const void *>(rowlb), reinterpret_cast<const void *>(rowub));
-     }
-     model->model_->loadProblem(numcols, numrows, start, index, value,
-                                collb, colub, obj, rowlb, rowub);
-}
-/* read quadratic part of the objective (the matrix part) */
-COINLIBAPI void COINLINKAGE
-Clp_loadQuadraticObjective(Clp_Simplex * model,
-                           const int numberColumns,
-                           const CoinBigIndex * start,
-                           const int * column,
-                           const double * element)
-{
-
-     model->model_->loadQuadraticObjective(numberColumns,
-                                           start, column, element);
-
-}
-/* Read an mps file from the given filename */
-COINLIBAPI int COINLINKAGE
-Clp_readMps(Clp_Simplex * model, const char *filename,
-            int keepNames,
-            int ignoreErrors)
-{
-     return model->model_->readMps(filename, keepNames != 0, ignoreErrors != 0);
-}
-/* Copy in integer informations */
-COINLIBAPI void COINLINKAGE
-Clp_copyInIntegerInformation(Clp_Simplex * model, const char * information)
-{
-     model->model_->copyInIntegerInformation(information);
-}
-/* Drop integer informations */
-COINLIBAPI void COINLINKAGE
-Clp_deleteIntegerInformation(Clp_Simplex * model)
-{
-     model->model_->deleteIntegerInformation();
-}
-/* Resizes rim part of model  */
-COINLIBAPI void COINLINKAGE
-Clp_resize (Clp_Simplex * model, int newNumberRows, int newNumberColumns)
-{
-     model->model_->resize(newNumberRows, newNumberColumns);
-}
-/* Deletes rows */
-COINLIBAPI void COINLINKAGE
-Clp_deleteRows(Clp_Simplex * model, int number, const int * which)
-{
-     model->model_->deleteRows(number, which);
-}
-/* Add rows */
-COINLIBAPI void COINLINKAGE
-Clp_addRows(Clp_Simplex * model, int number, const double * rowLower,
-            const double * rowUpper,
-            const int * rowStarts, const int * columns,
-            const double * elements)
-{
-     model->model_->addRows(number, rowLower, rowUpper, rowStarts, columns, elements);
-}
-
-/* Deletes columns */
-COINLIBAPI void COINLINKAGE
-Clp_deleteColumns(Clp_Simplex * model, int number, const int * which)
-{
-     model->model_->deleteColumns(number, which);
-}
-/* Add columns */
-COINLIBAPI void COINLINKAGE
-Clp_addColumns(Clp_Simplex * model, int number, const double * columnLower,
-               const double * columnUpper,
-               const double * objective,
-               const int * columnStarts, const int * rows,
-               const double * elements)
-{
-     model->model_->addColumns(number, columnLower, columnUpper, objective,
-                               columnStarts, rows, elements);
-}
-/* Change row lower bounds */
-COINLIBAPI void COINLINKAGE
-Clp_chgRowLower(Clp_Simplex * model, const double * rowLower)
-{
-     model->model_->chgRowLower(rowLower);
-}
-/* Change row upper bounds */
-COINLIBAPI void COINLINKAGE
-Clp_chgRowUpper(Clp_Simplex * model, const double * rowUpper)
-{
-     model->model_->chgRowUpper(rowUpper);
-}
-/* Change column lower bounds */
-COINLIBAPI void COINLINKAGE
-Clp_chgColumnLower(Clp_Simplex * model, const double * columnLower)
-{
-     model->model_->chgColumnLower(columnLower);
-}
-/* Change column upper bounds */
-COINLIBAPI void COINLINKAGE
-Clp_chgColumnUpper(Clp_Simplex * model, const double * columnUpper)
-{
-     model->model_->chgColumnUpper(columnUpper);
-}
-/* Change objective coefficients */
-COINLIBAPI void COINLINKAGE
-Clp_chgObjCoefficients(Clp_Simplex * model, const double * objIn)
-{
-     model->model_->chgObjCoefficients(objIn);
-}
-/* Drops names - makes lengthnames 0 and names empty */
-COINLIBAPI void COINLINKAGE
-Clp_dropNames(Clp_Simplex * model)
-{
-     model->model_->dropNames();
-}
-/* Copies in names */
-COINLIBAPI void COINLINKAGE
-Clp_copyNames(Clp_Simplex * model, const char * const * rowNamesIn,
-              const char * const * columnNamesIn)
-{
-     int iRow;
-     std::vector<std::string> rowNames;
-     int numberRows = model->model_->numberRows();
-     rowNames.reserve(numberRows);
-     for (iRow = 0; iRow < numberRows; iRow++) {
-          rowNames.push_back(rowNamesIn[iRow]);
-     }
-
-     int iColumn;
-     std::vector<std::string> columnNames;
-     int numberColumns = model->model_->numberColumns();
-     columnNames.reserve(numberColumns);
-     for (iColumn = 0; iColumn < numberColumns; iColumn++) {
-          columnNames.push_back(columnNamesIn[iColumn]);
-     }
-     model->model_->copyNames(rowNames, columnNames);
-}
-
-/* Number of rows */
-COINLIBAPI int COINLINKAGE
-Clp_numberRows(Clp_Simplex * model)
-{
-     return model->model_->numberRows();
-}
-/* Number of columns */
-COINLIBAPI int COINLINKAGE
-Clp_numberColumns(Clp_Simplex * model)
-{
-     return model->model_->numberColumns();
-}
-/* Primal tolerance to use */
-COINLIBAPI double COINLINKAGE
-Clp_primalTolerance(Clp_Simplex * model)
-{
-     return model->model_->primalTolerance();
-}
-COINLIBAPI void COINLINKAGE
-Clp_setPrimalTolerance(Clp_Simplex * model,  double value)
-{
-     model->model_->setPrimalTolerance(value);
-}
-/* Dual tolerance to use */
-COINLIBAPI double COINLINKAGE
-Clp_dualTolerance(Clp_Simplex * model)
-{
-     return model->model_->dualTolerance();
-}
-COINLIBAPI void COINLINKAGE
-Clp_setDualTolerance(Clp_Simplex * model,  double value)
-{
-     model->model_->setDualTolerance(value);
-}
-/* Dual objective limit */
-COINLIBAPI double COINLINKAGE
-Clp_dualObjectiveLimit(Clp_Simplex * model)
-{
-     return model->model_->dualObjectiveLimit();
-}
-COINLIBAPI void COINLINKAGE
-Clp_setDualObjectiveLimit(Clp_Simplex * model, double value)
-{
-     model->model_->setDualObjectiveLimit(value);
-}
-/* Objective offset */
-COINLIBAPI double COINLINKAGE
-Clp_objectiveOffset(Clp_Simplex * model)
-{
-     return model->model_->objectiveOffset();
-}
-COINLIBAPI void COINLINKAGE
-Clp_setObjectiveOffset(Clp_Simplex * model, double value)
-{
-     model->model_->setObjectiveOffset(value);
-}
-/* Fills in array with problem name  */
-COINLIBAPI void COINLINKAGE
-Clp_problemName(Clp_Simplex * model, int maxNumberCharacters, char * array)
-{
-     std::string name = model->model_->problemName();
-     maxNumberCharacters = CoinMin(maxNumberCharacters,
-     				   ((int) strlen(name.c_str()))+1) ;
-     strncpy(array, name.c_str(), maxNumberCharacters - 1);
-     array[maxNumberCharacters-1] = '\0';
-}
-/* Sets problem name.  Must have \0 at end.  */
-COINLIBAPI int COINLINKAGE
-Clp_setProblemName(Clp_Simplex * model, int /*maxNumberCharacters*/, char * array)
-{
-     return model->model_->setStrParam(ClpProbName, array);
-}
-/* Number of iterations */
-COINLIBAPI int COINLINKAGE
-Clp_numberIterations(Clp_Simplex * model)
-{
-     return model->model_->numberIterations();
-}
-COINLIBAPI void COINLINKAGE
-Clp_setNumberIterations(Clp_Simplex * model, int numberIterations)
-{
-     model->model_->setNumberIterations(numberIterations);
-}
-/* Maximum number of iterations */
-COINLIBAPI int maximumIterations(Clp_Simplex * model)
-{
-     return model->model_->maximumIterations();
-}
-COINLIBAPI void COINLINKAGE
-Clp_setMaximumIterations(Clp_Simplex * model, int value)
-{
-     model->model_->setMaximumIterations(value);
-}
-/* Maximum time in seconds (from when set called) */
-COINLIBAPI double COINLINKAGE
-Clp_maximumSeconds(Clp_Simplex * model)
-{
-     return model->model_->maximumSeconds();
-}
-COINLIBAPI void COINLINKAGE
-Clp_setMaximumSeconds(Clp_Simplex * model, double value)
-{
-     model->model_->setMaximumSeconds(value);
-}
-/* Returns true if hit maximum iteratio`ns (or time) */
-COINLIBAPI int COINLINKAGE
-Clp_hitMaximumIterations(Clp_Simplex * model)
-{
-     return model->model_->hitMaximumIterations() ? 1 : 0;
-}
-/* Status of problem:
-   0 - optimal
-   1 - primal infeasible
-   2 - dual infeasible
-   3 - stopped on iterations etc
-   4 - stopped due to errors
-*/
-COINLIBAPI int COINLINKAGE
-Clp_status(Clp_Simplex * model)
-{
-     return model->model_->status();
-}
-/* Set problem status */
-COINLIBAPI void COINLINKAGE
-Clp_setProblemStatus(Clp_Simplex * model, int problemStatus)
-{
-     model->model_->setProblemStatus(problemStatus);
-}
-/* Secondary status of problem - may get extended
-   0 - none
-   1 - primal infeasible because dual limit reached
-   2 - scaled problem optimal - unscaled has primal infeasibilities
-   3 - scaled problem optimal - unscaled has dual infeasibilities
-   4 - scaled problem optimal - unscaled has both dual and primal infeasibilities
-*/
-COINLIBAPI int COINLINKAGE
-Clp_secondaryStatus(Clp_Simplex * model)
-{
-     return model->model_->secondaryStatus();
-}
-COINLIBAPI void COINLINKAGE
-Clp_setSecondaryStatus(Clp_Simplex * model, int status)
-{
-     model->model_->setSecondaryStatus(status);
-}
-/* Direction of optimization (1 - minimize, -1 - maximize, 0 - ignore */
-COINLIBAPI double COINLINKAGE
-Clp_optimizationDirection(Clp_Simplex * model)
-{
-     return model->model_->optimizationDirection();
-}
-COINLIBAPI void COINLINKAGE
-Clp_setOptimizationDirection(Clp_Simplex * model, double value)
-{
-     model->model_->setOptimizationDirection(value);
-}
-/* Primal row solution */
-COINLIBAPI double * COINLINKAGE
-Clp_primalRowSolution(Clp_Simplex * model)
-{
-     return model->model_->primalRowSolution();
-}
-/* Primal column solution */
-COINLIBAPI double * COINLINKAGE
-Clp_primalColumnSolution(Clp_Simplex * model)
-{
-     return model->model_->primalColumnSolution();
-}
-/* Dual row solution */
-COINLIBAPI double * COINLINKAGE
-Clp_dualRowSolution(Clp_Simplex * model)
-{
-     return model->model_->dualRowSolution();
-}
-/* Reduced costs */
-COINLIBAPI double * COINLINKAGE
-Clp_dualColumnSolution(Clp_Simplex * model)
-{
-     return model->model_->dualColumnSolution();
-}
-/* Row lower */
-COINLIBAPI double* COINLINKAGE
-Clp_rowLower(Clp_Simplex * model)
-{
-     return model->model_->rowLower();
-}
-/* Row upper  */
-COINLIBAPI double* COINLINKAGE
-Clp_rowUpper(Clp_Simplex * model)
-{
-     return model->model_->rowUpper();
-}
-/* Objective */
-COINLIBAPI double * COINLINKAGE
-Clp_objective(Clp_Simplex * model)
-{
-     return model->model_->objective();
-}
-/* Column Lower */
-COINLIBAPI double * COINLINKAGE
-Clp_columnLower(Clp_Simplex * model)
-{
-     return model->model_->columnLower();
-}
-/* Column Upper */
-COINLIBAPI double * COINLINKAGE
-Clp_columnUpper(Clp_Simplex * model)
-{
-     return model->model_->columnUpper();
-}
-/* Number of elements in matrix */
-COINLIBAPI int COINLINKAGE
-Clp_getNumElements(Clp_Simplex * model)
-{
-     return model->model_->getNumElements();
-}
-// Column starts in matrix
-COINLIBAPI const CoinBigIndex * COINLINKAGE Clp_getVectorStarts(Clp_Simplex * model)
-{
-     CoinPackedMatrix * matrix;
-     matrix = model->model_->matrix();
-     return (matrix == NULL) ? NULL : matrix->getVectorStarts();
-}
-
-// Row indices in matrix
-COINLIBAPI const int * COINLINKAGE Clp_getIndices(Clp_Simplex * model)
-{
-     CoinPackedMatrix * matrix = model->model_->matrix();
-     return (matrix == NULL) ? NULL : matrix->getIndices();
-}
-
-// Column vector lengths in matrix
-COINLIBAPI const int * COINLINKAGE Clp_getVectorLengths(Clp_Simplex * model)
-{
-     CoinPackedMatrix * matrix = model->model_->matrix();
-     return (matrix == NULL) ? NULL : matrix->getVectorLengths();
-}
-
-// Element values in matrix
-COINLIBAPI const double * COINLINKAGE Clp_getElements(Clp_Simplex * model)
-{
-     CoinPackedMatrix * matrix = model->model_->matrix();
-     return (matrix == NULL) ? NULL : matrix->getElements();
-}
-/* Objective value */
-COINLIBAPI double COINLINKAGE
-Clp_objectiveValue(Clp_Simplex * model)
-{
-     return model->model_->objectiveValue();
-}
-/* Integer information */
-COINLIBAPI char * COINLINKAGE
-Clp_integerInformation(Clp_Simplex * model)
-{
-     return model->model_->integerInformation();
-}
-/* Infeasibility/unbounded ray (NULL returned if none/wrong)
-   Up to user to use free() on these arrays.  */
-COINLIBAPI double * COINLINKAGE
-Clp_infeasibilityRay(Clp_Simplex * model)
-{
-     const double * ray = model->model_->internalRay();
-     double * array = NULL;
-     int numberRows = model->model_->numberRows(); 
-     int status = model->model_->status();
-     if (status == 1 && ray) {
-          array = static_cast<double*>(malloc(numberRows*sizeof(double)));
-          memcpy(array,ray,numberRows*sizeof(double));
-#ifdef PRINT_RAY_METHOD
-	  printf("Infeasibility ray obtained by algorithm %s\n",model->model_->algorithm()>0 ?
-	      "primal" : "dual");
-#endif
-     }
-     return array;
-}
-COINLIBAPI double * COINLINKAGE
-Clp_unboundedRay(Clp_Simplex * model)
-{
-     const double * ray = model->model_->internalRay();
-     double * array = NULL;
-     int numberColumns = model->model_->numberColumns(); 
-     int status = model->model_->status();
-     if (status == 2 && ray) {
-          array = static_cast<double*>(malloc(numberColumns*sizeof(double)));
-          memcpy(array,ray,numberColumns*sizeof(double));
-     }
-     return array;
-}
-/* See if status array exists (partly for OsiClp) */
-COINLIBAPI int COINLINKAGE
-Clp_statusExists(Clp_Simplex * model)
-{
-     return model->model_->statusExists() ? 1 : 0;
-}
-/* Return address of status array (char[numberRows+numberColumns]) */
-COINLIBAPI unsigned char *  COINLINKAGE
-Clp_statusArray(Clp_Simplex * model)
-{
-     return model->model_->statusArray();
-}
-/* Copy in status vector */
-COINLIBAPI void COINLINKAGE
-Clp_copyinStatus(Clp_Simplex * model, const unsigned char * statusArray)
-{
-     model->model_->copyinStatus(statusArray);
-}
-
-/* User pointer for whatever reason */
-COINLIBAPI void COINLINKAGE
-Clp_setUserPointer (Clp_Simplex * model, void * pointer)
-{
-     model->model_->setUserPointer(pointer);
-}
-COINLIBAPI void * COINLINKAGE
-Clp_getUserPointer (Clp_Simplex * model)
-{
-     return model->model_->getUserPointer();
-}
-/* Pass in Callback function */
-COINLIBAPI void COINLINKAGE
-Clp_registerCallBack(Clp_Simplex * model,
-                     clp_callback userCallBack)
-{
-     // Will be copy of users one
-     delete model->handler_;
-     model->handler_ = new CMessageHandler(*(model->model_->messageHandler()));
-     model->handler_->setCallBack(userCallBack);
-     model->handler_->setModel(model);
-     model->model_->passInMessageHandler(model->handler_);
-}
-/* Unset Callback function */
-COINLIBAPI void COINLINKAGE
-Clp_clearCallBack(Clp_Simplex * model)
-{
-     delete model->handler_;
-     model->handler_ = NULL;
-}
-/* Amount of print out:
-   0 - none
-   1 - just final
-   2 - just factorizations
-   3 - as 2 plus a bit more
-   4 - verbose
-   above that 8,16,32 etc just for selective debug
-*/
-COINLIBAPI void COINLINKAGE
-Clp_setLogLevel(Clp_Simplex * model, int value)
-{
-     model->model_->setLogLevel(value);
-}
-COINLIBAPI int COINLINKAGE
-Clp_logLevel(Clp_Simplex * model)
-{
-     return model->model_->logLevel();
-}
-/* length of names (0 means no names0 */
-COINLIBAPI int COINLINKAGE
-Clp_lengthNames(Clp_Simplex * model)
-{
-     return model->model_->lengthNames();
-}
-/* Fill in array (at least lengthNames+1 long) with a row name */
-COINLIBAPI void COINLINKAGE
-Clp_rowName(Clp_Simplex * model, int iRow, char * name)
-{
-     std::string rowName = model->model_->rowName(iRow);
-     strcpy(name, rowName.c_str());
-}
-/* Fill in array (at least lengthNames+1 long) with a column name */
-COINLIBAPI void COINLINKAGE
-Clp_columnName(Clp_Simplex * model, int iColumn, char * name)
-{
-     std::string columnName = model->model_->columnName(iColumn);
-     strcpy(name, columnName.c_str());
-}
-
-/* General solve algorithm which can do presolve.
-   See  ClpSolve.hpp for options
-*/
-COINLIBAPI int COINLINKAGE
-Clp_initialSolve(Clp_Simplex * model)
-{
-     return model->model_->initialSolve();
-}
-/* Pass solve options. (Exception to direct analogue rule) */
-COINLIBAPI int COINLINKAGE
-Clp_initialSolveWithOptions(Clp_Simplex * model, Clp_Solve * s)
-{
-     return model->model_->initialSolve(s->options);
-}
-/* Barrier initial solve */
-COINLIBAPI int COINLINKAGE
-Clp_initialBarrierSolve(Clp_Simplex * model0)
-{
-     ClpSimplex *model = model0->model_;
-
-     return model->initialBarrierSolve();
-
-}
-/* Barrier initial solve */
-COINLIBAPI int COINLINKAGE
-Clp_initialBarrierNoCrossSolve(Clp_Simplex * model0)
-{
-     ClpSimplex *model = model0->model_;
-
-     return model->initialBarrierNoCrossSolve();
-
-}
-/* Dual initial solve */
-COINLIBAPI int COINLINKAGE
-Clp_initialDualSolve(Clp_Simplex * model)
-{
-     return model->model_->initialDualSolve();
-}
-/* Primal initial solve */
-COINLIBAPI int COINLINKAGE
-Clp_initialPrimalSolve(Clp_Simplex * model)
-{
-     return model->model_->initialPrimalSolve();
-}
-/* Dual algorithm - see ClpSimplexDual.hpp for method */
-COINLIBAPI int COINLINKAGE
-Clp_dual(Clp_Simplex * model, int ifValuesPass)
-{
-     return model->model_->dual(ifValuesPass);
-}
-/* Primal algorithm - see ClpSimplexPrimal.hpp for method */
-COINLIBAPI int COINLINKAGE
-Clp_primal(Clp_Simplex * model, int ifValuesPass)
-{
-     return model->model_->primal(ifValuesPass);
-}
-/* Sets or unsets scaling, 0 -off, 1 equilibrium, 2 geometric, 3, auto, 4 dynamic(later) */
-COINLIBAPI void COINLINKAGE
-Clp_scaling(Clp_Simplex * model, int mode)
-{
-     model->model_->scaling(mode);
-}
-/* Gets scalingFlag */
-COINLIBAPI int COINLINKAGE
-Clp_scalingFlag(Clp_Simplex * model)
-{
-     return model->model_->scalingFlag();
-}
-/* Crash - at present just aimed at dual, returns
-   -2 if dual preferred and crash basis created
-   -1 if dual preferred and all slack basis preferred
-   0 if basis going in was not all slack
-   1 if primal preferred and all slack basis preferred
-   2 if primal preferred and crash basis created.
-
-   if gap between bounds <="gap" variables can be flipped
-
-   If "pivot" is
-   0 No pivoting (so will just be choice of algorithm)
-   1 Simple pivoting e.g. gub
-   2 Mini iterations
-*/
-COINLIBAPI int COINLINKAGE
-Clp_crash(Clp_Simplex * model, double gap, int pivot)
-{
-     return model->model_->crash(gap, pivot);
-}
-/* If problem is primal feasible */
-COINLIBAPI int COINLINKAGE
-Clp_primalFeasible(Clp_Simplex * model)
-{
-     return model->model_->primalFeasible() ? 1 : 0;
-}
-/* If problem is dual feasible */
-COINLIBAPI int COINLINKAGE
-Clp_dualFeasible(Clp_Simplex * model)
-{
-     return model->model_->dualFeasible() ? 1 : 0;
-}
-/* Dual bound */
-COINLIBAPI double COINLINKAGE
-Clp_dualBound(Clp_Simplex * model)
-{
-     return model->model_->dualBound();
-}
-COINLIBAPI void COINLINKAGE
-Clp_setDualBound(Clp_Simplex * model, double value)
-{
-     model->model_->setDualBound(value);
-}
-/* Infeasibility cost */
-COINLIBAPI double COINLINKAGE
-Clp_infeasibilityCost(Clp_Simplex * model)
-{
-     return model->model_->infeasibilityCost();
-}
-COINLIBAPI void COINLINKAGE
-Clp_setInfeasibilityCost(Clp_Simplex * model, double value)
-{
-     model->model_->setInfeasibilityCost(value);
-}
-/* Perturbation:
-   50  - switch on perturbation
-   100 - auto perturb if takes too long (1.0e-6 largest nonzero)
-   101 - we are perturbed
-   102 - don't try perturbing again
-   default is 100
-   others are for playing
-*/
-COINLIBAPI int COINLINKAGE
-Clp_perturbation(Clp_Simplex * model)
-{
-     return model->model_->perturbation();
-}
-COINLIBAPI void COINLINKAGE
-Clp_setPerturbation(Clp_Simplex * model, int value)
-{
-     model->model_->setPerturbation(value);
-}
-/* Current (or last) algorithm */
-COINLIBAPI int COINLINKAGE
-Clp_algorithm(Clp_Simplex * model)
-{
-     return model->model_->algorithm();
-}
-/* Set algorithm */
-COINLIBAPI void COINLINKAGE
-Clp_setAlgorithm(Clp_Simplex * model, int value)
-{
-     model->model_->setAlgorithm(value);
-}
-/* Sum of dual infeasibilities */
-COINLIBAPI double COINLINKAGE
-Clp_sumDualInfeasibilities(Clp_Simplex * model)
-{
-     return model->model_->sumDualInfeasibilities();
-}
-/* Number of dual infeasibilities */
-COINLIBAPI int COINLINKAGE
-Clp_numberDualInfeasibilities(Clp_Simplex * model)
-{
-     return model->model_->numberDualInfeasibilities();
-}
-/* Sum of primal infeasibilities */
-COINLIBAPI double COINLINKAGE
-Clp_sumPrimalInfeasibilities(Clp_Simplex * model)
-{
-     return model->model_->sumPrimalInfeasibilities();
-}
-/* Number of primal infeasibilities */
-COINLIBAPI int COINLINKAGE
-Clp_numberPrimalInfeasibilities(Clp_Simplex * model)
-{
-     return model->model_->numberPrimalInfeasibilities();
-}
-/* Save model to file, returns 0 if success.  This is designed for
-   use outside algorithms so does not save iterating arrays etc.
-   It does not save any messaging information.
-   Does not save scaling values.
-   It does not know about all types of virtual functions.
-*/
-COINLIBAPI int COINLINKAGE
-Clp_saveModel(Clp_Simplex * model, const char * fileName)
-{
-     return model->model_->saveModel(fileName);
-}
-/* Restore model from file, returns 0 if success,
-   deletes current model */
-COINLIBAPI int COINLINKAGE
-Clp_restoreModel(Clp_Simplex * model, const char * fileName)
-{
-     return model->model_->restoreModel(fileName);
-}
-
-/* Just check solution (for external use) - sets sum of
-   infeasibilities etc */
-COINLIBAPI void COINLINKAGE
-Clp_checkSolution(Clp_Simplex * model)
-{
-     model->model_->checkSolution();
-}
-/* Number of rows */
-COINLIBAPI int COINLINKAGE
-Clp_getNumRows(Clp_Simplex * model)
-{
-     return model->model_->getNumRows();
-}
-/* Number of columns */
-COINLIBAPI int COINLINKAGE
-Clp_getNumCols(Clp_Simplex * model)
-{
-     return model->model_->getNumCols();
-}
-/* Number of iterations */
-COINLIBAPI int COINLINKAGE
-Clp_getIterationCount(Clp_Simplex * model)
-{
-     return model->model_->getIterationCount();
-}
-/* Are there a numerical difficulties? */
-COINLIBAPI int COINLINKAGE
-Clp_isAbandoned(Clp_Simplex * model)
-{
-     return model->model_->isAbandoned() ? 1 : 0;
-}
-/* Is optimality proven? */
-COINLIBAPI int COINLINKAGE
-Clp_isProvenOptimal(Clp_Simplex * model)
-{
-     return model->model_->isProvenOptimal() ? 1 : 0;
-}
-/* Is primal infeasiblity proven? */
-COINLIBAPI int COINLINKAGE
-Clp_isProvenPrimalInfeasible(Clp_Simplex * model)
-{
-     return model->model_->isProvenPrimalInfeasible() ? 1 : 0;
-}
-/* Is dual infeasiblity proven? */
-COINLIBAPI int COINLINKAGE
-Clp_isProvenDualInfeasible(Clp_Simplex * model)
-{
-     return model->model_->isProvenDualInfeasible() ? 1 : 0;
-}
-/* Is the given primal objective limit reached? */
-COINLIBAPI int COINLINKAGE
-Clp_isPrimalObjectiveLimitReached(Clp_Simplex * model)
-{
-     return model->model_->isPrimalObjectiveLimitReached() ? 1 : 0;
-}
-/* Is the given dual objective limit reached? */
-COINLIBAPI int COINLINKAGE
-Clp_isDualObjectiveLimitReached(Clp_Simplex * model)
-{
-     return model->model_->isDualObjectiveLimitReached() ? 1 : 0;
-}
-/* Iteration limit reached? */
-COINLIBAPI int COINLINKAGE
-Clp_isIterationLimitReached(Clp_Simplex * model)
-{
-     return model->model_->isIterationLimitReached() ? 1 : 0;
-}
-/* Direction of optimization (1 - minimize, -1 - maximize, 0 - ignore */
-COINLIBAPI double COINLINKAGE
-Clp_getObjSense(Clp_Simplex * model)
-{
-     return model->model_->getObjSense();
-}
-/* Direction of optimization (1 - minimize, -1 - maximize, 0 - ignore */
-COINLIBAPI void COINLINKAGE
-Clp_setObjSense(Clp_Simplex * model, double objsen)
-{
-     model->model_->setOptimizationDirection(objsen);
-}
-/* Primal row solution */
-COINLIBAPI const double * COINLINKAGE
-Clp_getRowActivity(Clp_Simplex * model)
-{
-     return model->model_->getRowActivity();
-}
-/* Primal column solution */
-COINLIBAPI const double * COINLINKAGE
-Clp_getColSolution(Clp_Simplex * model)
-{
-     return model->model_->getColSolution();
-}
-COINLIBAPI void COINLINKAGE
-Clp_setColSolution(Clp_Simplex * model, const double * input)
-{
-     model->model_->setColSolution(input);
-}
-/* Dual row solution */
-COINLIBAPI const double * COINLINKAGE
-Clp_getRowPrice(Clp_Simplex * model)
-{
-     return model->model_->getRowPrice();
-}
-/* Reduced costs */
-COINLIBAPI const double * COINLINKAGE
-Clp_getReducedCost(Clp_Simplex * model)
-{
-     return model->model_->getReducedCost();
-}
-/* Row lower */
-COINLIBAPI const double* COINLINKAGE
-Clp_getRowLower(Clp_Simplex * model)
-{
-     return model->model_->getRowLower();
-}
-/* Row upper  */
-COINLIBAPI const double* COINLINKAGE
-Clp_getRowUpper(Clp_Simplex * model)
-{
-     return model->model_->getRowUpper();
-}
-/* Objective */
-COINLIBAPI const double * COINLINKAGE
-Clp_getObjCoefficients(Clp_Simplex * model)
-{
-     return model->model_->getObjCoefficients();
-}
-/* Column Lower */
-COINLIBAPI const double * COINLINKAGE
-Clp_getColLower(Clp_Simplex * model)
-{
-     return model->model_->getColLower();
-}
-/* Column Upper */
-COINLIBAPI const double * COINLINKAGE
-Clp_getColUpper(Clp_Simplex * model)
-{
-     return model->model_->getColUpper();
-}
-/* Objective value */
-COINLIBAPI double COINLINKAGE
-Clp_getObjValue(Clp_Simplex * model)
-{
-     return model->model_->getObjValue();
-}
-/* Get variable basis info */
-COINLIBAPI int COINLINKAGE
-Clp_getColumnStatus(Clp_Simplex * model, int sequence)
-{
-     return (int) model->model_->getColumnStatus(sequence);
-}
-/* Get row basis info */
-COINLIBAPI int COINLINKAGE
-Clp_getRowStatus(Clp_Simplex * model, int sequence)
-{
-     return (int) model->model_->getRowStatus(sequence);
-}
-/* Set variable basis info */
-COINLIBAPI void COINLINKAGE
-Clp_setColumnStatus(Clp_Simplex * model, int sequence, int value)
-{
-     if (value >= 0 && value <= 5) {
-          model->model_->setColumnStatus(sequence, (ClpSimplex::Status) value );
-          if (value == 3 || value == 5)
-               model->model_->primalColumnSolution()[sequence] =
-                    model->model_->columnLower()[sequence];
-          else if (value == 2)
-               model->model_->primalColumnSolution()[sequence] =
-                    model->model_->columnUpper()[sequence];
-     }
-}
-/* Set row basis info */
-COINLIBAPI void COINLINKAGE
-Clp_setRowStatus(Clp_Simplex * model, int sequence, int value)
-{
-     if (value >= 0 && value <= 5) {
-          model->model_->setRowStatus(sequence, (ClpSimplex::Status) value );
-          if (value == 3 || value == 5)
-               model->model_->primalRowSolution()[sequence] =
-                    model->model_->rowLower()[sequence];
-          else if (value == 2)
-               model->model_->primalRowSolution()[sequence] =
-                    model->model_->rowUpper()[sequence];
-     }
-}
-/* Small element value - elements less than this set to zero,
-   default is 1.0e-20 */
-COINLIBAPI double COINLINKAGE
-Clp_getSmallElementValue(Clp_Simplex * model)
-{
-     return model->model_->getSmallElementValue();
-}
-COINLIBAPI void COINLINKAGE
-Clp_setSmallElementValue(Clp_Simplex * model, double value)
-{
-     model->model_->setSmallElementValue(value);
-}
-/* Print model */
-COINLIBAPI void COINLINKAGE
-Clp_printModel(Clp_Simplex * model, const char * prefix)
-{
-     ClpSimplex *clp_simplex = model->model_;
-     int numrows    = clp_simplex->numberRows();
-     int numcols    = clp_simplex->numberColumns();
-     int numelem    = clp_simplex->getNumElements();
-     const CoinBigIndex *start = clp_simplex->matrix()->getVectorStarts();
-     const int *index     = clp_simplex->matrix()->getIndices();
-     const double *value  = clp_simplex->matrix()->getElements();
-     const double *collb  = model->model_->columnLower();
-     const double *colub  = model->model_->columnUpper();
-     const double *obj    = model->model_->objective();
-     const double *rowlb  = model->model_->rowLower();
-     const double *rowub  = model->model_->rowUpper();
-     printf("%s numcols = %i, numrows = %i, numelem = %i\n",
-            prefix, numcols, numrows, numelem);
-     printf("%s model = %p, start = %p, index = %p, value = %p\n",
-            prefix, reinterpret_cast<const void *>(model), reinterpret_cast<const void *>(start), reinterpret_cast<const void *>(index), reinterpret_cast<const void *>(value));
-     clp_simplex->matrix()->dumpMatrix(NULL);
-     {
-          int i;
-          for (i = 0; i <= numcols; i++)
-               printf("%s start[%i] = %i\n", prefix, i, start[i]);
-          for (i = 0; i < numelem; i++)
-               printf("%s index[%i] = %i, value[%i] = %g\n",
-                      prefix, i, index[i], i, value[i]);
-     }
-
-     printf("%s collb = %p, colub = %p, obj = %p, rowlb = %p, rowub = %p\n",
-            prefix, reinterpret_cast<const void *>(collb), reinterpret_cast<const void *>(colub), reinterpret_cast<const void *>(obj), reinterpret_cast<const void *>(rowlb), reinterpret_cast<const void *>(rowub));
-     printf("%s optimization direction = %g\n", prefix, Clp_optimizationDirection(model));
-     printf("  (1 - minimize, -1 - maximize, 0 - ignore)\n");
-     {
-          int i;
-          for (i = 0; i < numcols; i++)
-               printf("%s collb[%i] = %g, colub[%i] = %g, obj[%i] = %g\n",
-                      prefix, i, collb[i], i, colub[i], i, obj[i]);
-          for (i = 0; i < numrows; i++)
-               printf("%s rowlb[%i] = %g, rowub[%i] = %g\n",
-                      prefix, i, rowlb[i], i, rowub[i]);
-     }
-}
-
-#ifndef SLIM_CLP
-/** Solve the problem with the idiot code */
-/* tryhard values:
-   tryhard & 7:
-      0: NOT lightweight, 105 iterations within a pass (when mu stays fixed)
-      1: lightweight, but focus more on optimality (mu is high)
-         (23 iters in a pass)
-      2: lightweight, but focus more on feasibility (11 iters in a pass)
-      3: lightweight, but focus more on feasibility (23 iters in a pass, so it
-         goes closer to opt than option 2)
-   tryhard >> 3:
-      number of passes, the larger the number the closer it gets to optimality
-*/
-COINLIBAPI void COINLINKAGE
-Clp_idiot(Clp_Simplex * model, int tryhard)
-{
-     ClpSimplex *clp = model->model_;
-     Idiot info(*clp);
-     int numberpass = tryhard >> 3;
-     int lightweight = tryhard & 7;
-     info.setLightweight(lightweight);
-     info.crash(numberpass, clp->messageHandler(), clp->messagesPointer(), false);
-}
-#endif
-
-COINLIBAPI Clp_Solve * COINLINKAGE 
-ClpSolve_new() 
-{ 
-    return new Clp_Solve(); 
-}
-
-COINLIBAPI void COINLINKAGE 
-ClpSolve_delete(Clp_Solve * solve) 
-{ 
-    delete solve; 
-}
-
-// space- and error-saving macros
-#define ClpSolveGetIntProperty(prop) \
-COINLIBAPI int COINLINKAGE \
-ClpSolve_ ## prop (Clp_Solve *s) \
-{ \
-    return s->options.prop(); \
-}
-
-#define ClpSolveSetIntProperty(prop) \
-COINLIBAPI void COINLINKAGE \
-ClpSolve_ ## prop (Clp_Solve *s, int val) \
-{ \
-    s->options.prop(val); \
-}
-
-COINLIBAPI void COINLINKAGE 
-ClpSolve_setSpecialOption(Clp_Solve * s, int which, int value, int extraInfo) 
-{
-    s->options.setSpecialOption(which,value,extraInfo);
-}
-
-COINLIBAPI int COINLINKAGE 
-ClpSolve_getSpecialOption(Clp_Solve * s, int which)
-{
-    return s->options.getSpecialOption(which);
-}
-
-COINLIBAPI void COINLINKAGE 
-ClpSolve_setSolveType(Clp_Solve * s, int method, int extraInfo)
-{
-    s->options.setSolveType(static_cast<ClpSolve::SolveType>(method), extraInfo);
-}
-
-ClpSolveGetIntProperty(getSolveType)
-
-COINLIBAPI void COINLINKAGE ClpSolve_setPresolveType(Clp_Solve * s, int amount, int extraInfo)
-{
-    s->options.setPresolveType(static_cast<ClpSolve::PresolveType>(amount),extraInfo);
-}
-
-ClpSolveGetIntProperty(getPresolveType)
-
-ClpSolveGetIntProperty(getPresolvePasses)
-
-
-COINLIBAPI int COINLINKAGE 
-ClpSolve_getExtraInfo(Clp_Solve * s, int which) {
-     return s->options.getExtraInfo(which);
-}
-
-ClpSolveSetIntProperty(setInfeasibleReturn)
-ClpSolveGetIntProperty(infeasibleReturn)
-
-ClpSolveGetIntProperty(doDual)
-ClpSolveSetIntProperty(setDoDual)
-
-ClpSolveGetIntProperty(doSingleton)
-ClpSolveSetIntProperty(setDoSingleton)
-
-ClpSolveGetIntProperty(doDoubleton)
-ClpSolveSetIntProperty(setDoDoubleton)
-
-ClpSolveGetIntProperty(doTripleton)
-ClpSolveSetIntProperty(setDoTripleton)
-
-ClpSolveGetIntProperty(doTighten)
-ClpSolveSetIntProperty(setDoTighten)
-
-ClpSolveGetIntProperty(doForcing)
-ClpSolveSetIntProperty(setDoForcing)
-
-ClpSolveGetIntProperty(doImpliedFree)
-ClpSolveSetIntProperty(setDoImpliedFree)
-
-ClpSolveGetIntProperty(doDupcol)
-ClpSolveSetIntProperty(setDoDupcol)
-
-ClpSolveGetIntProperty(doDuprow)
-ClpSolveSetIntProperty(setDoDuprow)
-
-ClpSolveGetIntProperty(doSingletonColumn)
-ClpSolveSetIntProperty(setDoSingletonColumn)
-
-ClpSolveGetIntProperty(presolveActions)
-ClpSolveSetIntProperty(setPresolveActions)
-
-ClpSolveGetIntProperty(substitution)
-ClpSolveSetIntProperty(setSubstitution)
-
-#if defined(__MWERKS__)
-#pragma export off
-#endif
-
diff --git a/cbits/coin/CoinAlloc.cpp b/cbits/coin/CoinAlloc.cpp
deleted file mode 100644
--- a/cbits/coin/CoinAlloc.cpp
+++ /dev/null
@@ -1,176 +0,0 @@
-/* $Id: CoinAlloc.cpp 1373 2011-01-03 23:57:44Z lou $ */
-// Copyright (C) 2007, International Business Machines
-// Corporation and others.  All Rights Reserved.
-// This code is licensed under the terms of the Eclipse Public License (EPL).
-
-#include <cassert>
-#include <cstdlib>
-#include <new>
-#include "CoinAlloc.hpp"
-
-#if (COINUTILS_MEMPOOL_MAXPOOLED >= 0)
-
-//=============================================================================
-
-CoinMempool::CoinMempool(size_t entry) :
-#if (COIN_MEMPOOL_SAVE_BLOCKHEADS==1)
-  block_heads_(NULL),
-  block_num_(0),
-  max_block_num_(0),
-#endif
-  last_block_size_(0),
-  first_free_(NULL),
-  entry_size_(entry)
-{
-#if defined(COINUTILS_PTHREADS) && (COINUTILS_PTHREAD == 1)
-  pthread_mutex_init(&mutex_, NULL);
-#endif
-  assert((entry_size_/COINUTILS_MEMPOOL_ALIGNMENT)*COINUTILS_MEMPOOL_ALIGNMENT
-	 == entry_size_);
-}
-
-//=============================================================================
-
-CoinMempool::~CoinMempool()
-{
-#if (COIN_MEMPOOL_SAVE_BLOCKHEADS==1)
-  for (size_t i = 0; i < block_num_; ++i) {
-    free(block_heads_[i]);
-  }
-#endif
-#if defined(COINUTILS_PTHREADS) && (COINUTILS_PTHREAD == 1)
-  pthread_mutex_destroy(&mutex_);
-#endif
-}
-
-//==============================================================================
-
-char* 
-CoinMempool::alloc()
-{
-  lock_mutex();
-  if (first_free_ == NULL) {
-    unlock_mutex();
-    char* block = allocate_new_block();
-    lock_mutex();
-#if (COIN_MEMPOOL_SAVE_BLOCKHEADS==1)
-    // see if we can record another block head. If not, then resize
-    // block_heads
-    if (max_block_num_ == block_num_) {
-      max_block_num_ = 2 * block_num_ + 10;
-      char** old_block_heads = block_heads_;
-      block_heads_ = (char**)malloc(max_block_num_ * sizeof(char*));
-      CoinMemcpyN( old_block_heads,block_num_,block_heads_);
-      free(old_block_heads);
-    }
-    // save the new block
-    block_heads_[block_num_++] = block;
-#endif
-    // link in the new block
-    *(char**)(block+((last_block_size_-1)*entry_size_)) = first_free_;
-    first_free_ = block;
-  }
-  char* p = first_free_;
-  first_free_ = *(char**)p;
-  unlock_mutex();
-  return p;
-}
-
-//=============================================================================
-
-char*
-CoinMempool::allocate_new_block()
-{
-  last_block_size_ = static_cast<int>(1.5 * last_block_size_ + 32);
-  char* block = static_cast<char*>(std::malloc(last_block_size_*entry_size_));
-  // link the entries in the new block together
-  for (int i = last_block_size_-2; i >= 0; --i) {
-    *(char**)(block+(i*entry_size_)) = block+((i+1)*entry_size_);
-  }
-  // terminate the linked list with a null pointer
-  *(char**)(block+((last_block_size_-1)*entry_size_)) = NULL;
-  return block;
-}
-
-//#############################################################################
-
-CoinAlloc CoinAllocator;
-
-CoinAlloc::CoinAlloc() :
-  pool_(NULL),
-  maxpooled_(COINUTILS_MEMPOOL_MAXPOOLED)
-{
-  const char* maxpooled = std::getenv("COINUTILS_MEMPOOL_MAXPOOLED");
-  if (maxpooled) {
-    maxpooled_ = std::atoi(maxpooled);
-  }
-  const size_t poolnum = maxpooled_ / COINUTILS_MEMPOOL_ALIGNMENT;
-  maxpooled_ = poolnum * COINUTILS_MEMPOOL_ALIGNMENT;
-  if (maxpooled_ > 0) {
-    pool_ = (CoinMempool*)malloc(sizeof(CoinMempool)*poolnum);
-    for (int i = poolnum-1; i >= 0; --i) {
-      new (&pool_[i]) CoinMempool(i*COINUTILS_MEMPOOL_ALIGNMENT);
-    }
-  }
-}
-
-//#############################################################################
-
-#if defined(COINUTILS_MEMPOOL_OVERRIDE_NEW) && (COINUTILS_MEMPOOL_OVERRIDE_NEW == 1)
-void* operator new(std::size_t sz) throw (std::bad_alloc)
-{ 
-  return CoinAllocator.alloc(sz); 
-}
-
-void* operator new[](std::size_t sz) throw (std::bad_alloc)
-{ 
-  return CoinAllocator.alloc(sz); 
-}
-
-void operator delete(void* p) throw()
-{ 
-  CoinAllocator.dealloc(p); 
-}
-  
-void operator delete[](void* p) throw()
-{ 
-  CoinAllocator.dealloc(p); 
-}
-  
-void* operator new(std::size_t sz, const std::nothrow_t&) throw()
-{
-  void *p = NULL;
-  try {
-    p = CoinAllocator.alloc(sz);
-  }
-  catch (std::bad_alloc &ba) {
-    return NULL;
-  }
-  return p;
-}
-
-void* operator new[](std::size_t sz, const std::nothrow_t&) throw()
-{
-  void *p = NULL;
-  try {
-    p = CoinAllocator.alloc(sz);
-  }
-  catch (std::bad_alloc &ba) {
-    return NULL;
-  }
-  return p;
-}
-
-void operator delete(void* p, const std::nothrow_t&) throw()
-{
-  CoinAllocator.dealloc(p); 
-}  
-
-void operator delete[](void* p, const std::nothrow_t&) throw()
-{
-  CoinAllocator.dealloc(p); 
-}  
-
-#endif
-
-#endif /*(COINUTILS_MEMPOOL_MAXPOOLED >= 0)*/
diff --git a/cbits/coin/CoinParam.cpp b/cbits/coin/CoinParam.cpp
deleted file mode 100644
--- a/cbits/coin/CoinParam.cpp
+++ /dev/null
@@ -1,566 +0,0 @@
-/* $Id: CoinParam.cpp 1424 2011-05-02 08:02:28Z stefan $ */
-// Copyright (C) 2006, International Business Machines
-// Corporation and others.  All Rights Reserved.
-// This code is licensed under the terms of the Eclipse Public License (EPL).
-
-#include <string>
-#include <cassert>
-#include <iostream>
-
-#include "CoinPragma.hpp"
-#include "CoinParam.hpp"
-
-/*
-  Constructors and destructors
-
-  There's a generic constructor and one for integer, double, keyword, string,
-  and action parameters.
-*/
-
-/*
-  Default constructor.
-*/
-CoinParam::CoinParam () 
-  : type_(coinParamInvalid),
-    name_(),
-    lengthName_(0),
-    lengthMatch_(0),
-    lowerDblValue_(0.0),
-    upperDblValue_(0.0),
-    dblValue_(0.0),
-    lowerIntValue_(0),
-    upperIntValue_(0),
-    intValue_(0),
-    strValue_(),
-    definedKwds_(),
-    currentKwd_(-1),
-    pushFunc_(0),
-    pullFunc_(0),
-    shortHelp_(),
-    longHelp_(),
-    display_(false)
-{
-  /* Nothing to be done here */
-}
-
-
-/*
-  Constructor for double parameter
-*/
-CoinParam::CoinParam (std::string name, std::string help,
-		      double lower, double upper, double dflt, bool display)
-  : type_(coinParamDbl),
-    name_(name),
-    lengthName_(0),
-    lengthMatch_(0),
-    lowerDblValue_(lower),
-    upperDblValue_(upper),
-    dblValue_(dflt),
-    lowerIntValue_(0),
-    upperIntValue_(0),
-    intValue_(0),
-    strValue_(),
-    definedKwds_(),
-    currentKwd_(-1),
-    pushFunc_(0),
-    pullFunc_(0),
-    shortHelp_(help),
-    longHelp_(),
-    display_(display)
-{
-  processName() ;
-}
-
-/*
-  Constructor for integer parameter
-*/
-CoinParam::CoinParam (std::string name, std::string help,
-		      int lower, int upper, int dflt, bool display)
-  : type_(coinParamInt),
-    name_(name),
-    lengthName_(0),
-    lengthMatch_(0),
-    lowerDblValue_(0.0),
-    upperDblValue_(0.0),
-    dblValue_(0.0),
-    lowerIntValue_(lower),
-    upperIntValue_(upper),
-    intValue_(dflt),
-    strValue_(),
-    definedKwds_(),
-    currentKwd_(-1),
-    pushFunc_(0),
-    pullFunc_(0),
-    shortHelp_(help),
-    longHelp_(),
-    display_(display)
-{
-  processName() ;
-}
-
-/*
-  Constructor for keyword parameter.
-*/
-CoinParam::CoinParam (std::string name, std::string help,
-		      std::string firstValue, int dflt, bool display)
-  : type_(coinParamKwd),
-    name_(name),
-    lengthName_(0),
-    lengthMatch_(0),
-    lowerDblValue_(0.0),
-    upperDblValue_(0.0),
-    dblValue_(0.0),
-    lowerIntValue_(0),
-    upperIntValue_(0),
-    intValue_(0),
-    strValue_(),
-    definedKwds_(),
-    currentKwd_(dflt),
-    pushFunc_(0),
-    pullFunc_(0),
-    shortHelp_(help),
-    longHelp_(),
-    display_(display)
-{
-  processName() ;
-  definedKwds_.push_back(firstValue) ;
-}
-
-/*
-  Constructor for string parameter.
-*/
-CoinParam::CoinParam (std::string name, std::string help,
-	 	      std::string dflt, bool display)
-  : type_(coinParamStr),
-    name_(name),
-    lengthName_(0),
-    lengthMatch_(0),
-    lowerDblValue_(0.0),
-    upperDblValue_(0.0),
-    dblValue_(0.0),
-    lowerIntValue_(0),
-    upperIntValue_(0),
-    intValue_(0),
-    strValue_(dflt),
-    definedKwds_(),
-    currentKwd_(0),
-    pushFunc_(0),
-    pullFunc_(0),
-    shortHelp_(help),
-    longHelp_(),
-    display_(display)
-{
-  processName() ;
-}
-
-/*
-  Constructor for action parameter.
-*/
-CoinParam::CoinParam (std::string name, std::string help, bool display)
-  : type_(coinParamAct),
-    name_(name),
-    lengthName_(0),
-    lengthMatch_(0),
-    lowerDblValue_(0.0),
-    upperDblValue_(0.0),
-    dblValue_(0.0),
-    lowerIntValue_(0),
-    upperIntValue_(0),
-    intValue_(0),
-    strValue_(),
-    definedKwds_(),
-    currentKwd_(0),
-    pushFunc_(0),
-    pullFunc_(0),
-    shortHelp_(help),
-    longHelp_(),
-    display_(display)
-{
-  processName() ;
-}
-
-/*
-  Copy constructor.
-*/
-CoinParam::CoinParam (const CoinParam &orig)
-  : type_(orig.type_),
-    lengthName_(orig.lengthName_),
-    lengthMatch_(orig.lengthMatch_),
-    lowerDblValue_(orig.lowerDblValue_),
-    upperDblValue_(orig.upperDblValue_),
-    dblValue_(orig.dblValue_),
-    lowerIntValue_(orig.lowerIntValue_),
-    upperIntValue_(orig.upperIntValue_),
-    intValue_(orig.intValue_),
-    currentKwd_(orig.currentKwd_),
-    pushFunc_(orig.pushFunc_),
-    pullFunc_(orig.pullFunc_),
-    display_(orig.display_)
-{
-  name_ = orig.name_ ;
-  strValue_ = orig.strValue_ ;
-  definedKwds_ = orig.definedKwds_ ;
-  shortHelp_ = orig.shortHelp_ ;
-  longHelp_ = orig.longHelp_ ;
-}
-
-/*
-  Clone
-*/
-
-CoinParam *CoinParam::clone ()
-{
-  return (new CoinParam(*this)) ;
-}
-
-CoinParam &CoinParam::operator= (const CoinParam &rhs)
-{
-  if (this != &rhs)
-  { type_ = rhs.type_ ;
-    name_ = rhs.name_ ;
-    lengthName_ = rhs.lengthName_ ;
-    lengthMatch_ = rhs.lengthMatch_ ;
-    lowerDblValue_ = rhs.lowerDblValue_ ;
-    upperDblValue_ = rhs.upperDblValue_ ;
-    dblValue_ = rhs.dblValue_ ;
-    lowerIntValue_ = rhs.lowerIntValue_ ;
-    upperIntValue_ = rhs.upperIntValue_ ;
-    intValue_ = rhs.intValue_ ;
-    strValue_ = rhs.strValue_ ;
-    definedKwds_ = rhs.definedKwds_ ;
-    currentKwd_ = rhs.currentKwd_ ;
-    pushFunc_ = rhs.pushFunc_ ;
-    pullFunc_ = rhs.pullFunc_ ;
-    shortHelp_ = rhs.shortHelp_ ;
-    longHelp_ = rhs.longHelp_ ;
-    display_ = rhs.display_ ; }
-
-  return *this ; }
-
-/*
-  Destructor
-*/
-CoinParam::~CoinParam ()
-{ /* Nothing more to do */ }
-
-
-/*
-  Methods to manipulate a CoinParam object.
-*/
-
-/*
-  Process the parameter name.
-  
-  Process the name for efficient matching: determine if an `!' is present. If
-  so, locate and record the position and remove the `!'.
-*/
-
-void CoinParam::processName()
-
-{ std::string::size_type shriekPos = name_.find('!') ;
-  lengthName_ = name_.length() ;
-  if (shriekPos == std::string::npos)
-  { lengthMatch_ = lengthName_ ; }
-  else
-  { lengthMatch_ = shriekPos ;
-    name_ = name_.substr(0,shriekPos)+name_.substr(shriekPos+1) ;
-    lengthName_-- ; }
-
-  return ; }
-
-/*
-  Check an input string to see if it matches the parameter name. The whole
-  input string must match, and the length of the match must exceed the
-  minimum match length. A match is impossible if the string is longer than
-  the name.
-
-  Returns: 0 for no match, 1 for a successful match, 2 if the match is short
-*/
-int CoinParam::matches (std::string input) const
-{
-  size_t inputLen = input.length() ;
-  if (inputLen <= lengthName_)
-  { size_t i ;
-    for (i = 0 ; i < inputLen ; i++)
-    { if (tolower(name_[i]) != tolower(input[i])) 
-	break ; }
-    if (i < inputLen)
-    { return (0) ; }
-    else
-    if (i >= lengthMatch_)
-    { return (1) ; }
-    else
-    { return (2) ; } }
-  
-  return (0) ;
-}
-
-
-/*
-  Return the parameter name, formatted to indicate how it'll be matched.
-  E.g., some!Name will come back as some(Name).
-*/
-std::string CoinParam::matchName () const
-{ 
-  if (lengthMatch_ == lengthName_) 
-  { return name_ ; }
-  else
-  { return name_.substr(0,lengthMatch_)+"("+name_.substr(lengthMatch_)+")" ; }
-}
-
-
-/*
-  Print the long help message and a message about appropriate values.
-*/
-void CoinParam::printLongHelp() const
-{
-  if (longHelp_ != "")
-  { CoinParamUtils::printIt(longHelp_.c_str()) ; }
-  else
-  if (shortHelp_ != "")
-  { CoinParamUtils::printIt(shortHelp_.c_str()) ; }
-  else
-  { CoinParamUtils::printIt("No help provided.") ; }
-
-  switch (type_)
-  { case coinParamDbl:
-    { std::cout << "<Range of values is " << lowerDblValue_ << " to "
-		<< upperDblValue_ << ";\n\tcurrent " << dblValue_ << ">"
-		<< std::endl ;
-      assert (upperDblValue_>lowerDblValue_) ;
-      break ; }
-    case coinParamInt:
-    { std::cout << "<Range of values is " << lowerIntValue_ << " to "
-		<< upperIntValue_ << ";\n\tcurrent " << intValue_ << ">"
-		<< std::endl ;
-      assert (upperIntValue_>lowerIntValue_) ;
-      break ; }
-    case coinParamKwd:
-    { printKwds() ;
-      break ; }
-    case coinParamStr:
-    { std::cout << "<Current value is " ;
-      if (strValue_ == "")
-      { std::cout << "(unset)>" ; }
-      else
-      { std::cout << "`" << strValue_ << "'>" ; }
-      std::cout << std::endl ;
-      break ; }
-    case coinParamAct:
-    { break ; }
-    default:
-    { std::cout << "!! invalid parameter type !!" << std::endl ;
-      assert (false) ; } }
-}
-
-
-/*
-  Methods to manipulate the value of a parameter.
-*/
-
-/*
-  Methods to manipulate the values associated with a keyword parameter.
-*/
-
-/*
-  Add a keyword to the list for a keyword parameter.
-*/
-void CoinParam::appendKwd (std::string kwd)
-{ 
-  assert (type_ == coinParamKwd) ;
-
-  definedKwds_.push_back(kwd) ;
-}
-
-/*
-  Scan the keywords of a keyword parameter and return the integer index of
-  the keyword matching the input, or -1 for no match.
-*/
-int CoinParam::kwdIndex (std::string input) const
-{
-  assert (type_ == coinParamKwd) ;
-
-  int whichItem = -1 ;
-  size_t numberItems = definedKwds_.size() ;
-  if (numberItems > 0)
-  { size_t inputLen = input.length() ;
-    size_t it ;
-/*
-  Open a loop to check each keyword against the input string. We don't record
-  the match length for keywords, so we need to check each one for an `!' and
-  do the necessary preprocessing (record position and elide `!') before
-  checking for a match of the required length.
-*/
-    for (it = 0 ; it < numberItems ; it++)
-    { std::string kwd = definedKwds_[it] ;
-      std::string::size_type shriekPos = kwd.find('!') ;
-      size_t kwdLen = kwd.length() ;
-      size_t matchLen = kwdLen ;
-      if (shriekPos != std::string::npos)
-      { matchLen = shriekPos ;
-	kwd = kwd.substr(0,shriekPos)+kwd.substr(shriekPos+1) ;
-	kwdLen = kwd.length() ; }
-/*
-  Match is possible only if input is shorter than the keyword. The entire input
-  must match and the match must exceed the minimum length.
-*/
-      if (inputLen <= kwdLen)
-      { unsigned int i ;
-	for (i = 0 ; i < inputLen ; i++)
-	{ if (tolower(kwd[i]) != tolower(input[i])) 
-	    break ; }
-	if (i >= inputLen && i >= matchLen)
-	{ whichItem = static_cast<int>(it) ;
-	  break ; } } } }
-
-  return (whichItem) ;
-}
-
-/*
-  Set current value for a keyword parameter using a string.
-*/
-void CoinParam::setKwdVal (const std::string value)
-{
-  assert (type_ == coinParamKwd) ;
-
-  int action = kwdIndex(value) ;
-  if (action >= 0)
-  { currentKwd_ = action ; }
-}
-
-/*
-  Set current value for keyword parameter using an integer. Echo the new value
-  to cout if requested.
-*/
-void CoinParam::setKwdVal (int value, bool printIt)
-{
-  assert (type_ == coinParamKwd) ;
-  assert (value >= 0 && unsigned(value) < definedKwds_.size()) ;
-
-  if (printIt && value != currentKwd_)
-  { std::cout << "Option for " << name_ << " changed from "
-              << definedKwds_[currentKwd_] << " to "
-              << definedKwds_[value] << std::endl ; }
-
-  currentKwd_ = value ;
-}
-
-/*
-  Return the string corresponding to the current value.
-*/
-std::string CoinParam::kwdVal() const
-{
-  assert (type_ == coinParamKwd) ;
-  
-  return (definedKwds_[currentKwd_]) ;
-}
-
-/*
-  Print the keywords for a keyword parameter, formatted to indicate how they'll
-  be matched. (E.g., some!Name prints as some(Name).). Follow with current
-  value.
-*/
-void CoinParam::printKwds () const
-{
-  assert (type_ == coinParamKwd) ;
-
-  std::cout << "Possible options for " << name_ << " are:" ;
-  unsigned int it ;
-  int maxAcross = 5 ;
-  for (it = 0 ; it < definedKwds_.size() ; it++)
-  { std::string kwd = definedKwds_[it] ;
-    std::string::size_type shriekPos = kwd.find('!') ;
-    if (shriekPos != std::string::npos)
-    { kwd = kwd.substr(0,shriekPos)+"("+kwd.substr(shriekPos+1)+")" ; }
-    if (it%maxAcross == 0)
-    { std::cout << std::endl ; }
-    std::cout << "  " << kwd ; }
-  std::cout << std::endl ;
-
-  assert (currentKwd_ >= 0 && unsigned(currentKwd_) < definedKwds_.size()) ;
-
-  std::string current = definedKwds_[currentKwd_] ;
-  std::string::size_type  shriekPos = current.find('!') ;
-  if (shriekPos != std::string::npos)
-  { current = current.substr(0,shriekPos)+
-			"("+current.substr(shriekPos+1)+")" ; }
-  std::cout << "  <current: " << current << ">" << std::endl ;
-}
-
-
-/*
-  Methods to manipulate the value of a string parameter.
-*/
-
-void CoinParam::setStrVal (std::string value)
-{ 
-  assert (type_ == coinParamStr) ;
-
-  strValue_ = value ;
-}
-
-std::string CoinParam::strVal () const
-{
-  assert (type_ == coinParamStr) ;
-
-  return (strValue_) ;
-}
-
-
-/*
-  Methods to manipulate the value of a double parameter.
-*/
-
-void CoinParam::setDblVal (double value)
-{ 
-  assert (type_ == coinParamDbl) ;
-
-  dblValue_ = value ;
-}
-
-double CoinParam::dblVal () const
-{
-  assert (type_ == coinParamDbl) ;
-
-  return (dblValue_) ;
-}
-
-
-/*
-  Methods to manipulate the value of an integer parameter.
-*/
-
-void CoinParam::setIntVal (int value)
-{ 
-  assert (type_ == coinParamInt) ;
-
-  intValue_ = value ;
-}
-
-int CoinParam::intVal () const
-{
-  assert (type_ == coinParamInt) ;
-
-  return (intValue_) ;
-}
-
-/*
-  A print function (friend of the class)
-*/
-
-std::ostream &operator<< (std::ostream &s, const CoinParam &param)
-{
-  switch (param.type())
-  { case CoinParam::coinParamDbl:
-    { return (s << param.dblVal()) ; }
-    case CoinParam::coinParamInt:
-    { return (s << param.intVal()) ; }
-    case CoinParam::coinParamKwd:
-    { return (s << param.kwdVal()) ; }
-    case CoinParam::coinParamStr:
-    { return (s << param.strVal()) ; }
-    case CoinParam::coinParamAct:
-    { return (s << "<evokes action>") ; }
-    default:
-    { return (s << "!! invalid parameter type !!") ; } }
-}
diff --git a/cbits/coin/CoinParamUtils.cpp b/cbits/coin/CoinParamUtils.cpp
deleted file mode 100644
--- a/cbits/coin/CoinParamUtils.cpp
+++ /dev/null
@@ -1,800 +0,0 @@
-/* $Id: CoinParamUtils.cpp 1468 2011-09-03 17:19:13Z stefan $ */
-// Copyright (C) 2007, International Business Machines
-// Corporation and others.  All Rights Reserved.
-// This code is licensed under the terms of the Eclipse Public License (EPL).
-
-#include <cassert>
-#include <cerrno>
-#include <iostream>
-
-#include "CoinUtilsConfig.h"
-#include "CoinParam.hpp"
-#include <cstdlib>
-#include <cstring>
-#include <cstdio>
-
-#ifdef COIN_HAS_READLINE     
-#include <readline/readline.h>
-#include <readline/history.h>
-#endif
-
-/* Unnamed local namespace */
-namespace
-{
-
-/*
-  cmdField: The index of the current command line field. Forced to -1 when
-	    accepting commands from stdin (interactive) or a command file.
-  readSrc:  Current input source.
-
-  pendingVal: When the form param=value is encountered, both keyword and value
-	    form one command line field. We need to return `param' as the
-	    field and somehow keep the value around for the upcoming call
-	    that'll request it. That's the purpose of pendingVal.
-*/
-
-int cmdField = 1 ;
-FILE *readSrc = stdin ;
-std::string pendingVal = "" ;
-
-
-/*
-  Get next command or field in command. When in interactive mode, prompt the
-  user and read the resulting line of input.
-*/
-std::string nextField (const char *prompt)
-{
-  static char line[1000] ;
-  static char *where = NULL ;
-  std::string field ;
-  const char *dflt_prompt = "Eh? " ;
-
-  if (prompt == 0)
-  { prompt = dflt_prompt ; }
-/*
-  Do we have a line at the moment? If not, acquire one. When we're done,
-  line holds the input line and where points to the start of the line. If we're
-  using the readline library, add non-empty lines to the history list.
-*/
-  if (!where) {
-#ifdef COIN_HAS_READLINE
-    if (readSrc == stdin)
-    { where = readline(prompt) ;
-      if (where)
-      { if (*where)
-	  add_history (where) ;
-	strcpy(line,where) ;
-	free(where) ;
-	where = line ; } }
-    else
-    { where = fgets(line,1000,readSrc) ; }
-#else
-    if (readSrc == stdin)
-      { fprintf(stdout,"%s",prompt) ;
-      fflush(stdout) ; }
-    where = fgets(line,1000,readSrc) ;
-#endif
-/*
-  If where is NULL, we have EOF. Return a null string.
-*/
-    if (!where)
-      return field ;
-/*
-  Clean the image. Trailing junk first. The line will be cut off at the last
-  non-whitespace character, but we need to scan until we find the end of the
-  string or some other non-printing character to make sure we don't miss a
-  printing character after whitespace.
-*/
-    char *lastNonBlank = line-1 ;
-    for (where = line ; *where != '\0' ; where++)
-    { if (*where != '\t' && *where < ' ')
-      { break ; }
-      if (*where != '\t' && *where != ' ')
-      { lastNonBlank = where ; } }
-    *(lastNonBlank+1) = '\0' ;
-    where = line ; }
-/*
-  Munch through leading white space.
-*/
-  while (*where == ' ' || *where == '\t')
-    where++ ;
-/*
-  See if we can separate a field; if so, copy it over into field for return.
-  If we're out of line, return the string "EOL".
-*/
-  char *saveWhere = where ;
-  while (*where != ' ' && *where != '\t' && *where!='\0')
-    where++ ;
-  if (where != saveWhere)
-  { char save = *where ;
-    *where = '\0' ;
-    field = saveWhere ;
-    *where = save ; }
-  else
-  { where = NULL ;
-    field = "EOL" ; }
-
-  return (field) ; }
-
-}
-
-
-/* Visible functions */
-
-namespace CoinParamUtils
-{
-
-/*
-  As mentioned above, cmdField set to -1 is the indication that we're reading
-  from stdin or a file.
-*/
-void setInputSrc (FILE *src)
-
-{ if (src != 0)
-  { cmdField = -1 ;
-    readSrc = src ; } }
-
-/*
-  A utility to allow clients to determine if we're processing parameters from
-  the comand line or otherwise.
-*/
-bool isCommandLine ()
-
-{ assert(cmdField != 0) ;
-  
-  if (cmdField > 0)
-  { return (true) ; }
-  else
-  { return (false) ; } }
-
-/*
-  A utility to allow clients to determine if we're accepting parameters
-  interactively.
-*/
-bool isInteractive ()
-
-{ assert(cmdField != 0) ;
-  
-  if (cmdField < 0 && readSrc == stdin)
-  { return (true) ; }
-  else
-  { return (false) ; } }
-
-/*
-  Utility functions for acquiring input.
-*/
-
-
-/*
-  Return the next field (word) from the current command line. Generally, this
-  is expected to be of the form `-param' or `--param', with special cases as
-  set out below.
-
-  If we're in interactive mode (cmdField == -1), nextField does all the work
-  to prompt the user and return the next field from the resulting input. It is
-  assumed that the user knows not to use `-' or `--' prefixes in interactive
-  mode.
-
-  If we're in command line mode (cmdField > 0), cmdField indicates the
-  current command line word. The order of processing goes like this:
-    * A stand-alone `-' is converted to `stdin'
-    * A stand-alone '--' is returned as a word; interpretation is up to the
-      client.
-    * A prefix of '-' or '--' is stripped from the field.
-  If the result is `stdin', it's assumed we're switching to interactive mode
-  and the user is prompted for another command.
-
-  Whatever results from the above sequence is returned to the client as the
-  next field. An empty string indicates end of input.
-
-  Prompt will be used by nextField if it's necessary to prompt the user for
-  a command (only when reading from stdin).
-
-  If provided, pfx is set to the prefix ("-", "--", or "") stripped from the
-  field. Lack of prefix is not necessarily an error because of the following
-  scenario:  To read a file, the verbose command might be "foo -import
-  myfile". But we might want to allow a short form, "foo myfile". And we'd
-  like "foo import" to be interpreted as "foo -import import" (i.e., import the
-  file named `import').
-*/
-
-std::string getCommand (int argc, const char *argv[],
-			const std::string prompt, std::string *pfx)
-
-{ std::string field = "EOL" ;
-  pendingVal = "" ;
-  int pfxlen ;
-
-  if (pfx != 0)
-  { (*pfx) = "" ; }
-/*
-  Acquire the next field, and convert as outlined above if we're processing
-  command line parameters.
-*/
-  while (field == "EOL")
-  { pfxlen = 0 ;
-    if (cmdField > 0)
-    { if (cmdField < argc)
-      { field = argv[cmdField++] ;
-	if (field == "-")
-	{ field = "stdin" ; }
-	else
-	if (field == "--")
-	{ /* Prevent `--' from being eaten by next case. */ }
-	else
-	{ if (field[0] == '-')
-	  { pfxlen = 1 ;
-	    if (field[1] == '-')
-	      pfxlen = 2 ;
-	    if (pfx != 0)
-	      (*pfx) = field.substr(0,pfxlen) ;
-	    field = field.substr(pfxlen) ; } } }
-      else
-      { field = "" ; } }
-    else
-    { field = nextField(prompt.c_str()) ; }
-    if (field == "stdin")
-    { std::cout << "Switching to line mode" << std::endl ;
-      cmdField = -1 ;
-      field = nextField(prompt.c_str()) ; } }
-/*
-  Are we left with something of the form param=value? If so, separate the
-  pieces, returning `param' and saving `value' for later use as per comments
-  at the head of the file.
-*/
-  std::string::size_type found = field.find('=');
-  if (found != std::string::npos)
-  { pendingVal = field.substr(found+1) ;
-    field = field.substr(0,found) ; }
-
-  return (field) ; }
-
-
-/*
-  Function to look up a parameter keyword (name) in the parameter vector and
-  deal with the result. The keyword may end in one or more `?' characters;
-  this is a query for information about matching parameters.
-
-  If we have a single match satisfying the minimal match requirements, and
-  there's no query, we simply return the index of the matching parameter in
-  the parameter vector. If there are no matches, and no query, the return
-  value will be -3. No matches on a query returns -1.
-
-  A single short match, or a single match of any length with a query, will
-  result in a short help message
-
-  If present, these values are set as follows:
-    * matchCntp is set to the number of parameters that matched.
-    * shortCntp is set to the number of matches that failed to meet the minimum
-      match requirement.
-    * queryCntp is set to the number of trailing `?' characters at the end
-      of name.
-
-  Return values:
-    >0:	index of the single unique match for the name
-    -1: query present
-    -2: no query, one or more short matches
-    -3: no query, no match
-    -4: multiple full matches (indicates configuration error)
-
-  The final three parameters (matchCnt, shortCnt, queryCnt) are optional and
-  default to null. Use them if you want more detail on the match.
-*/
-
-int lookupParam (std::string name, CoinParamVec &paramVec,
-		 int *matchCntp, int *shortCntp, int *queryCntp)
-
-{
-  int retval = -3 ;
-
-  if (matchCntp != 0)
-  { *matchCntp = 0 ; }
-  if (shortCntp != 0)
-  { *shortCntp = 0 ; }
-  if (queryCntp != 0)
-  { *queryCntp = 0 ; }
-/*
-  Is there anything here at all? 
-*/
-  if (name.length() == 0)
-  { return (retval) ; }
-/*
-  Scan the parameter name to see if it ends in one or more `?' characters. If
-  so, take it as a request to return a list of parameters that match name up
-  to the first `?'.  The strings '?' and '???' are considered to be valid
-  parameter names (short and long help, respectively) and are handled as
-  special cases: If the whole string is `?'s, one and three are commands as
-  is, while 2 and 4 or more are queries about `?' or `???'.
-*/
-  int numQuery = 0 ;
-  { int length = static_cast<int>(name.length()) ;
-    int i ;
-    for (i = length-1 ; i >= 0 && name[i] == '?' ; i--)
-    { numQuery++ ; }
-    if (numQuery == length)
-    { switch (length)
-      { case 1:
-	case 3:
-	{ numQuery = 0 ;
-	  break ; }
-	case 2:
-	{ numQuery -= 1 ;
-	  break ; }
-        default:
-	{ numQuery -= 3 ;
-	  break ; } } }
-    name = name.substr(0,length-numQuery) ;
-    if (queryCntp != 0)
-    { *queryCntp = numQuery ; } }
-/*
-  See if we can match the parameter name. On return, matchNdx is set to the
-  last match satisfying the minimal match criteria, or -1 if there's no
-  match.  matchCnt is the number of matches satisfying the minimum match
-  length, and shortCnt is possible matches that were short of the minimum
-  match length,
-*/
-  int matchNdx = -1 ;
-  int shortCnt = 0 ;
-  int matchCnt = CoinParamUtils::matchParam(paramVec,name,matchNdx,shortCnt) ;
-/*
-  Set up return values before we get into further processing.
-*/
-  if (matchCntp != 0)
-  { *matchCntp = matchCnt ; }
-  if (shortCntp != 0)
-  { *shortCntp = shortCnt ; }
-  if (numQuery > 0)
-  { retval = -1 ; }
-  else
-  { if (matchCnt+shortCnt == 0)
-    { retval = -3 ; }
-    else
-    if (matchCnt > 1)
-    { retval = -4 ; }
-    else
-    { retval = -2 ; } }
-/*
-  No matches? Nothing more to be done here.
-*/
-  if (matchCnt+shortCnt == 0)
-  { return (retval) ; }
-/*
-  A unique match and no `?' in the name says we have our parameter. Return
-  the result.
-*/
-  if (matchCnt == 1 && shortCnt == 0 && numQuery == 0)
-  { assert (matchNdx >= 0 && matchNdx < static_cast<int>(paramVec.size())) ;
-    return (matchNdx) ; }
-/*
-  A single match? There are two possibilities:
-    * The string specified is shorter than the match length requested by the
-      parameter. (Useful for avoiding inadvertent execution of commands that
-      the client might regret.)
-    * The string specified contained a `?', in which case we print the help.
-      The match may or may not be short.
-*/
-  if (matchCnt+shortCnt == 1)
-  { CoinParamUtils::shortOrHelpOne(paramVec,matchNdx,name,numQuery) ;
-    return (retval) ; }
-/*
-  The final case: multiple matches. Most commonly this will be multiple short
-  matches. If we have multiple matches satisfying the minimal length
-  criteria, we have a configuration problem.  The other question is whether
-  the user wanted help information. Two question marks gets short help.
-*/
-  if (matchCnt > 1)
-  { std::cout
-    << "Configuration error! `" << name
-    <<"' was fully matched " << matchCnt << " times!"
-    << std::endl ; }
-  std::cout
-    << "Multiple matches for `" << name << "'; possible completions:"
-    << std::endl ;
-  CoinParamUtils::shortOrHelpMany(paramVec,name,numQuery) ;
-
-  return (retval) ; }
-
-
-/*
-  Utility functions to acquire parameter values from the command line. For
-  all of these, a pendingVal is consumed if it exists.
-*/
-
-
-/*
-  Read a string and return a pointer to the string. Set valid to indicate the
-  result of parsing: 0: okay, 1: <unused>, 2: not present.
-*/
-
-std::string getStringField (int argc, const char *argv[], int *valid)
-
-{ std::string field ;
-
-  if (pendingVal != "")
-  { field = pendingVal ;
-    pendingVal = "" ; }
-  else
-  { field = "EOL" ;
-    if (cmdField > 0)
-    { if (cmdField < argc)
-      { field = argv[cmdField++] ; } }
-    else
-    { field = nextField(0) ; } }
-
-  if (valid != 0)
-  { if (field != "EOL")
-    { *valid = 0 ; }
-    else
-    { *valid = 2 ; } }
-
-  return (field) ; }
-
-/*
-  Read an int and return the value. Set valid to indicate the result of
-  parsing: 0: okay, 1: parse error, 2: not present.
-*/
-
-int getIntField (int argc, const char *argv[], int *valid)
-
-{ std::string field ;
-
-  if (pendingVal != "")
-  { field = pendingVal ;
-    pendingVal = "" ; }
-  else
-  { field = "EOL" ;
-    if (cmdField > 0)
-    { if (cmdField < argc)
-      { field = argv[cmdField++] ; } }
-    else
-    { field = nextField(0) ; } }
-/*
-  The only way to check for parse error here is to set the system variable
-  errno to 0 and then see if it's nonzero after we try to convert the string
-  to integer.
-*/
-  int value = 0 ;
-  errno = 0 ;
-  if (field != "EOL")
-  { value =  atoi(field.c_str()) ; }
-
-  if (valid != 0)
-  { if (field != "EOL")
-    { if (errno == 0)
-      { *valid = 0 ; }
-      else
-      { *valid = 1 ; } }
-    else
-    { *valid = 2 ; } }
-
-  return (value) ; }
-
-
-/*
-  Read a double and return the value. Set valid to indicate the result of
-  parsing: 0: okay, 1: bad parse, 2: not present. But we'll never return
-  valid == 1 because atof gives us no way to tell.)
-*/
-
-double getDoubleField (int argc, const char *argv[], int *valid)
-
-{ std::string field ;
-
-  if (pendingVal != "")
-  { field = pendingVal ;
-    pendingVal = "" ; }
-  else
-  { field = "EOL" ;
-    if (cmdField > 0)
-    { if (cmdField < argc)
-      { field = argv[cmdField++] ; } }
-    else
-    { field = nextField(0) ; } }
-/*
-  The only way to check for parse error here is to set the system variable
-  errno to 0 and then see if it's nonzero after we try to convert the string
-  to integer.
-*/
-  double value = 0.0 ;
-  errno = 0 ;
-  if (field != "EOL")
-  { value = atof(field.c_str()) ; }
-
-  if (valid != 0)
-  { if (field != "EOL")
-    { if (errno == 0)
-      { *valid = 0 ; }
-      else
-      { *valid = 1 ; } }
-    else
-    { *valid = 2 ; } }
-
-  return (value) ; }
-
-
-/*
-  Utility function to scan a parameter vector for matches. Sets matchNdx to
-  the index of the last parameter that meets the minimal match criteria (but
-  note there should be at most one such parameter if the parameter vector is
-  properly configured). Sets shortCnt to the number of short matches (should
-  be zero in a properly configured vector if a minimal match is found).
-  Returns the number of matches satisfying the minimal match requirement
-  (should be 0 or 1 in a properly configured vector).
-
-  The routine allows for the possibility of null entries in the parameter
-  vector.
-
-  In order to handle `?' and `???', there's nothing to it but to force a
-  unique match if we match `?' exactly. (This is another quirk of clp/cbc
-  parameter parsing, which we need to match for historical reasons.)
-*/
-
-int matchParam (const CoinParamVec &paramVec, std::string name,
-		int &matchNdx, int &shortCnt)
-
-{ 
-  int vecLen = static_cast<int>(paramVec.size()) ;
-  int matchCnt = 0 ;
-
-  matchNdx = -1 ;
-  shortCnt = 0 ;
-
-  for (int i = 0 ; i < vecLen  ; i++)
-  { CoinParam *param =  paramVec[i] ;
-    if (param == 0) continue ;
-    int match = paramVec[i]->matches(name) ;
-    if (match == 1)
-    { matchNdx = i ;
-      matchCnt++ ;
-      if (name == "?")
-      { matchCnt = 1 ;
-	break ; } }
-    else
-    { shortCnt += match>>1 ; } }
-
-  return (matchCnt) ;
-}
-
-/*
-  Now a bunch of routines that are useful in the context of generating help
-  messages.
-*/
-
-/*
-  Simple formatting routine for long messages. Used to print long help for
-  parameters. Lines are broken at the first white space after 65 characters,
-  or when an explicit return (`\n') character is scanned. Leading spaces are
-  suppressed.
-*/
-
-void printIt (const char *msg)
-
-{ int length = static_cast<int>(strlen(msg)) ;
-  char temp[101] ;
-  int i ;
-  int n = 0 ;
-  for (i = 0 ; i < length ; i++)
-  { if (msg[i] == '\n' ||
-	(n >= 65 && (msg[i] == ' ' || msg[i] == '\t')))
-    { temp[n] = '\0' ;
-      std::cout << temp << std::endl ;
-      n = 0 ; }
-    else
-    if (n || msg[i] != ' ')
-    { temp[n++] = msg[i] ; } }
-  if (n > 0)
-  { temp[n] = '\0' ;
-    std::cout << temp << std::endl ; }
-
-  return ; }
-
-
-/*
-  Utility function for the case where a name matches a single parameter, but
-  either it's short, or the user wanted help, or both.
-
-  The routine allows for the possibility that there are null entries in the
-  parameter vector, but matchNdx should point to a valid entry if it's >= 0.
-*/
-
-void shortOrHelpOne (CoinParamVec &paramVec,
-		     int matchNdx, std::string name, int numQuery)
-
-{ int i ;
-  int numParams = static_cast<int>(paramVec.size()) ;
-  int lclNdx = -1 ;
-/*
-  For a short match, we need to look up the parameter again. This should find
-  a short match, given the conditions where this routine is called. But be
-  prepared to find a full match.
-  
-  If matchNdx >= 0, just use the index we're handed.
-*/
-  if (matchNdx < 0) 
-  { int match = 0 ;
-    for (i = 0 ; i < numParams ; i++)
-    { CoinParam *param =  paramVec[i] ;
-      if (param == 0) continue ;
-      int match = param->matches(name) ;
-      if (match != 0)
-      { lclNdx = i ;
-	break ; } }
-
-    assert (lclNdx >= 0) ;
-
-    if (match == 1)
-    { std::cout
-	<< "Match for '" << name << "': "
-	<< paramVec[matchNdx]->matchName() << "." ; }
-    else
-    { std::cout
-      << "Short match for '" << name << "'; possible completion: "
-      << paramVec[lclNdx]->matchName() << "." ; } }
-  else
-  { assert(matchNdx >= 0 && matchNdx < static_cast<int>(paramVec.size())) ;
-    std::cout << "Match for `" << name << "': "
-	      << paramVec[matchNdx]->matchName() ;
-    lclNdx = matchNdx ; }
-/*
-  Print some help, if there was a `?' in the name. `??' gets the long help.
-*/
-  if (numQuery > 0)
-  { std::cout << std::endl ;
-    if (numQuery == 1)
-    { std::cout << paramVec[lclNdx]->shortHelp() ; }
-    else
-    { paramVec[lclNdx]->printLongHelp() ; } }
-  std::cout << std::endl ;
-
-  return ; }
-
-/*
-  Utility function for the case where a name matches multiple parameters.
-  Zero or one `?' gets just the matching names, while `??' gets short help
-  with each match.
-
-  The routine allows for the possibility that there are null entries in the
-  parameter vector.
-*/
-
-void shortOrHelpMany (CoinParamVec &paramVec, std::string name, int numQuery)
-
-{ int numParams = static_cast<int>(paramVec.size()) ;
-/*
-  Scan the parameter list. For each match, print just the name, or the name
-  and short help.
-*/
-  int lineLen = 0 ;
-  bool printed = false ;
-  for (int i = 0 ; i < numParams ; i++)
-  { CoinParam *param = paramVec[i] ;
-    if (param == 0) continue ;
-    int match = param->matches(name) ;
-    if (match > 0)
-    { std::string nme = param->matchName() ;
-      int len = static_cast<int>(nme.length()) ;
-      if (numQuery >= 2) 
-      { std::cout << nme << " : " << param->shortHelp() ;
-	std::cout << std::endl ; }
-      else
-      { lineLen += 2+len ;
-	if (lineLen > 80)
-	{ std::cout << std::endl ;
-	  lineLen = 2+len ; }
-	std::cout << "  " << nme ;
-	printed = true ; } } }
-
-  if (printed)
-  { std::cout << std::endl ; }
-
-  return ; }
-
-
-/*
-  A generic help message that explains the basic operation of parameter
-  parsing.
-*/
-
-void printGenericHelp ()
-
-{ std::cout << std::endl ;
-  std::cout
-    << "For command line arguments, keywords have a leading `-' or '--'; "
-    << std::endl ;
-  std::cout
-    << "-stdin or just - switches to stdin with a prompt."
-    << std::endl ;
-  std::cout
-    << "When prompted, one command per line, without the leading `-'."
-    << std::endl ;
-  std::cout
-    << "abcd value sets abcd to value."
-    << std::endl ;
-  std::cout
-    << "abcd without a value (where one is expected) gives the current value."
-    << std::endl ;
-  std::cout
-    << "abcd? gives a list of possible matches; if there's only one, a short"
-    << std::endl ;
-  std::cout
-    << "help message is printed."
-    << std::endl ;
-  std::cout
-    << "abcd?? prints the short help for all matches; if there's only one"
-    << std::endl ;
-  std::cout
-    << "match, a longer help message and current value are printed."
-    << std::endl ;
-  
-  return ; }
-
-
-/*
-  Utility function for various levels of `help' command. The entries between
-  paramVec[firstParam] and paramVec[lastParam], inclusive, will be printed.
-  If shortHelp is true, the short help message will be printed for each
-  parameter. If longHelp is true, the long help message will be printed for
-  each parameter.  If hidden is true, even parameters with display = false
-  will be printed. Each line is prefaced with the specified prefix.
-
-  The routine allows for the possibility that there are null entries in the
-  parameter vector.
-*/
-
-void printHelp (CoinParamVec &paramVec, int firstParam, int lastParam,
-		std::string prefix,
-		bool shortHelp, bool longHelp, bool hidden)
-
-{ bool noHelp = !(shortHelp || longHelp) ;
-  int i ;
-  int pfxLen = static_cast<int>(prefix.length()) ;
-  bool printed = false ;
-
-  if (noHelp)
-  { int lineLen = 0 ;
-    for (i = firstParam ; i <= lastParam ; i++)
-    { CoinParam *param = paramVec[i] ;
-      if (param == 0) continue ;
-      if (param->display() || hidden)
-      { std::string nme = param->matchName() ;
-	int len = static_cast<int>(nme.length()) ;
-	if (!printed)
-	{ std::cout << std::endl << prefix ;
-	  lineLen += pfxLen ;
-	  printed = true ; }
-	lineLen += 2+len ;
-	if (lineLen > 80)
-	{ std::cout << std::endl << prefix ;
-	  lineLen = pfxLen+2+len ; }
-        std::cout << "  " << nme ; } }
-    if (printed)
-    { std::cout << std::endl ; } }
-  else
-  if (shortHelp)
-  { for (i = firstParam ; i <= lastParam ; i++)
-    { CoinParam *param = paramVec[i] ;
-      if (param == 0) continue ;
-      if (param->display() || hidden)
-      { std::cout << std::endl << prefix ;
-	std::cout << param->matchName() ;
-	std::cout << ": " ;
-	std::cout << param->shortHelp() ; } }
-      std::cout << std::endl ; }
-  else
-  if (longHelp)
-  { for (i = firstParam ; i <= lastParam ; i++)
-    { CoinParam *param = paramVec[i] ;
-      if (param == 0) continue ;
-      if (param->display() || hidden)
-      { std::cout << std::endl << prefix ;
-	std::cout << "Command: " << param->matchName() ;
-        std::cout << std::endl << prefix ;
-	std::cout << "---- description" << std::endl ;
-	printIt(param->longHelp().c_str()) ;
-	std::cout << prefix << "----" << std::endl ; } } }
-
-  std::cout << std::endl ;
-
-  return ; }   
-
-} // end namespace CoinParamUtils
diff --git a/examples/Base.hs b/examples/Base.hs
new file mode 100644
--- /dev/null
+++ b/examples/Base.hs
@@ -0,0 +1,36 @@
+module Base where
+
+import Numeric.Limp.Rep
+import Numeric.Limp.Program
+import Numeric.Limp.Solvers.Cbc
+
+data V0
+
+deriving instance Ord  V0
+deriving instance Eq   V0
+deriving instance Show V0
+
+data V2 = A | B
+    deriving (Ord, Eq, Show)
+
+
+solve_problem :: (Show z, Show r, Ord z, Ord r) => (Direction -> Program z r IntDouble) -> IO ()
+solve_problem problem
+ = do   let a1 = solve $ problem Minimise
+        putStrLn "*** Minimise *** "
+        show_result a1
+
+        let a2 = solve $ problem Maximise
+        putStrLn "*** Maximise *** "
+        show_result a2
+
+show_result :: (Show z, Show r, Ord z, Ord r) => Either Error (Assignment z r IntDouble) -> IO ()
+show_result as
+ = case as of
+    Left e
+     -> do putStrLn "Error:"
+           print e
+    Right a
+     -> do putStrLn "Success:"
+           print a
+
diff --git a/examples/Clustering.hs b/examples/Clustering.hs
new file mode 100644
--- /dev/null
+++ b/examples/Clustering.hs
@@ -0,0 +1,114 @@
+-- Example program based on one generated by our fusion/clustering algorithm
+--
+-- sum1 = fold   (+) 0    xs
+-- nor1 = map    (/ sum1) xs
+-- ys   = filter (>  0)   xs
+-- sum2 = fold   (+) 0    ys
+-- nor2 = map    (/ sum2) xs
+--
+
+module Clustering (clustering) where
+
+import Base
+import Numeric.Limp.Rep
+import Numeric.Limp.Program
+
+import qualified Numeric.Limp.Canon as C
+import qualified Numeric.Limp.Canon.Pretty as C
+
+-- | One for each combinator
+data Node
+ = Sum1 | Nor1 | Ys | Sum2 | Nor2
+ deriving (Ord, Eq, Show)
+
+-- | The integer variables:
+-- forall a b. 0 <= F a b <= 1 :: Z
+--                  F a b == 0 iff a and b are fused
+data VZ
+ = F Node Node
+ deriving (Ord, Eq, Show)
+
+-- | The real variables:
+-- forall a b. F a b == 0 ==> O a == O b
+--                            O a >  O b if edge from a to b
+data VR
+ = O Node
+ deriving (Ord, Eq, Show)
+
+
+problem1 :: Direction -> Program VZ VR IntDouble
+problem1 dir
+ = program dir
+           objective
+           constraints
+           bounds
+
+--Minimise	5f(sum1, ys)		+	1f(sum1, sum2)
+--		+	5f(sum1, nor2)	+	5f(ys, sum2)
+--		+	5f(ys, nor1)		+	5f(sum2, nor1)
+--		+	5f(nor1, nor2)
+objective
+ =    f100 Sum1 Ys     .+. f1   Sum1 Sum2
+ .+.  f100 Sum1 Nor2   .+. f100 Ys   Sum2
+ .+.  f100 Ys   Nor1   .+. f1   Sum2 Nor1
+ .+.  f100 Nor1 Nor2
+
+--Subject to	
+--	   f(sum1, ys) 					≤ 				f(sum1, sum2)
+--	   f(sum2, ys)					≤ 				f(sum1, sum2)
+--	-5f(sum1, ys)		≤ o(ys)	- o(sum1)	≤ 5f(sum1, ys)
+--	-5f(sum1, sum2)	≤ o(sum2)	- o(sum1)	≤ 5f(sum1, sum2)
+--	1f(ys, sum2)		≤ o(sum2)	- o(ys)		≤ 5f(ys, sum2)
+--	-5f(nor1, nor2)	≤ o(nor2)	- o(nor1)	≤ 5f(nor1, nor2)
+--						    o(sum1)	< o(nor1)
+--						    o(sum2)	< o(nor2)
+--
+constraints
+ =    filt Sum1 Sum2 Ys
+ :&&  filt Sum2 Nor1 Ys
+ :&&  odiff (-5) Sum1 Ys    5
+ :&&  odiff (-5) Sum1 Sum2  5
+ :&&  odiff   1  Ys   Sum2  5
+ :&&  odiff (-5) Ys   Nor1  5
+ :&&  odiff (-5) Nor1 Nor2  5
+ :&&  odiff (-5) Sum1 Nor2  5
+ :&&  odiff (-5) Sum2 Nor1  5
+ :&&  o Sum1 `lt` o Nor1
+ :&&  o Sum2 `lt` o Nor2
+ where
+
+  o  = r1 . O
+
+  lt a b = a .+. c1 :<= b
+
+  filt a b c
+   =   f1 a c      :<= f1 a b
+   :&& f1 b c      :<= f1 a b
+
+  odiff p a b q
+   = Between (p *. f1 a b) (o b .-. o a) (q *. f1 a b)
+
+bounds
+ = [ binary $ F Sum1 Sum2
+   , binary $ F Sum1 Ys
+   , binary $ F Sum1 Nor2
+   , binary $ F Ys   Sum2
+   , binary $ F Nor1 Ys
+   , binary $ F Nor1 Sum2
+   , binary $ F Nor1 Nor2
+   ]
+
+f100 :: Node -> Node -> Linear VZ VR IntDouble KZ
+f100 a b
+ = 100 *. f1 a b
+
+f1 :: Node -> Node -> Linear VZ VR IntDouble KZ
+f1 a b
+ = z1 $ F (min a b) (max a b)
+
+
+clustering :: IO ()
+clustering
+ = do   solve_problem problem1
+        putStr (show $ C.program $ problem1 Minimise)
+
diff --git a/examples/Infeasible.hs b/examples/Infeasible.hs
new file mode 100644
--- /dev/null
+++ b/examples/Infeasible.hs
@@ -0,0 +1,21 @@
+module Infeasible (infeasible) where
+
+import Base
+import Numeric.Limp.Rep
+import Numeric.Limp.Program
+
+-- Minimise     1
+-- Subject to   a >= b + 1
+--              b >= a + 1
+problem1 :: Direction -> Program V0 V2 IntDouble
+problem1 dir
+ = program dir
+            c1
+           (   r1 A :>= r1 B .+. c1
+           :&& r1 B :>= r1 A .+. c1)
+           []
+
+infeasible :: IO ()
+infeasible
+ = do   solve_problem problem1
+
diff --git a/examples/Simple.hs b/examples/Simple.hs
new file mode 100644
--- /dev/null
+++ b/examples/Simple.hs
@@ -0,0 +1,59 @@
+module Simple (simple) where
+
+import Base
+import Numeric.Limp.Rep
+import Numeric.Limp.Program
+
+-- Minimise     a + b
+-- Subject to   a + 2b >= 3
+-- Where        0 <= a <= 10 :: Z
+--              0 <= b <= 10 :: R
+problem1 :: Direction -> Program String String IntDouble
+problem1 dir
+ = program dir
+           (z1 "a" .+. r1 "b" )
+           (z1 "a" .+. r "b" 2 :>= con 3)
+           [ lowerUpperZ 0 "a" 10
+           , lowerUpperR 0 "b" 10 ]
+
+-- As above, but swap coefficients on >= 3 constraint.
+--
+-- Minimise     a + b
+-- Subject to   2a + b >= 3
+-- Where        0 <= a <= 10 :: Z
+--              0 <= b <= 10 :: R
+problem2 :: Direction -> Program String String IntDouble
+problem2 dir
+ = program dir
+           (z1 "a" .+. r1 "b" )
+           (z "a" 2 .+. r1 "b" :>= con 3)
+           [ lowerUpperZ 0 "a" 10
+           , lowerUpperR 0 "b" 10 ]
+
+
+-- Leave out the bounds on variables
+--
+-- Minimise     a + b
+-- Subject to   a >= b
+--              b >= a
+--              a >= 3
+--              b <= 10
+-- Where        a :: Z
+--              b :: R
+problem3 :: Direction -> Program String String IntDouble
+problem3 dir
+ = program dir
+           (z1 "a" .+. r1 "b")
+           (   z1 "a" :>= r1 "b"
+           :&& r1 "b" :>= z1 "a"
+           :&& z1 "a" :>= con 3
+           :&& r1 "b" :<= con 10)
+           [ ]
+
+
+simple :: IO ()
+simple
+ = do   solve_problem problem1
+        solve_problem problem2
+        solve_problem problem3
+
diff --git a/examples/Stupid.hs b/examples/Stupid.hs
new file mode 100644
--- /dev/null
+++ b/examples/Stupid.hs
@@ -0,0 +1,19 @@
+-- Stupid examples that might just fail
+module Stupid (stupid) where
+
+import Base
+import Numeric.Limp.Rep
+import Numeric.Limp.Program
+
+problem1 :: Direction -> Program String String IntDouble
+problem1 dir
+ = program dir
+           c1
+           CTrue
+           []
+
+stupid :: IO ()
+stupid
+ = do   solve_problem problem1
+
+
diff --git a/limp-cbc.cabal b/limp-cbc.cabal
--- a/limp-cbc.cabal
+++ b/limp-cbc.cabal
@@ -1,5 +1,5 @@
 name:                limp-cbc
-version:             0.3.2.0
+version:             0.3.2.1
 synopsis:            bindings for integer linear programming solver Coin/CBC
 description:         very simple binding to external solver, CBC.
                      CBC is somewhat faster than GLPK, and also has a more permissive licence.
@@ -294,6 +294,7 @@
     extra-libraries:  Cbc Clp CbcSolver Cgl Osi OsiCbc OsiClp OsiCommonTests CoinUtils CoinMP stdc++
     include-dirs:     cbits
     includes:         Cbc.h
+    c-sources:        cbits/Cbc.cpp
   else
     extra-libraries:  stdc++
     include-dirs:     cbits, cbits/coin
@@ -302,31 +303,23 @@
 
     c-sources:
       cbits/Cbc.cpp
-      cbits/coin/Cbc_ampl.cpp
-      cbits/coin/Cbc_C_Interface.cpp
-      cbits/coin/CbcBranchAllDifferent.cpp
       cbits/coin/CbcBranchCut.cpp
       cbits/coin/CbcBranchDecision.cpp
       cbits/coin/CbcBranchDefaultDecision.cpp
       cbits/coin/CbcBranchDynamic.cpp
       cbits/coin/CbcBranchingObject.cpp
       cbits/coin/CbcBranchLotsize.cpp
-      cbits/coin/CbcBranchToFixLots.cpp
-      cbits/coin/CbcCbcParam.cpp
       cbits/coin/CbcClique.cpp
       cbits/coin/CbcCompareDefault.cpp
       cbits/coin/CbcCompareDepth.cpp
-      cbits/coin/CbcCompareEstimate.cpp
-      cbits/coin/CbcCompareObjective.cpp
       cbits/coin/CbcConsequence.cpp
       cbits/coin/CbcCountRowCut.cpp
       cbits/coin/CbcCutGenerator.cpp
       cbits/coin/CbcCutModifier.cpp
-      cbits/coin/CbcCutSubsetModifier.cpp
       cbits/coin/CbcDummyBranchingObject.cpp
+      cbits/coin/CbcOrClpParam.cpp
       cbits/coin/CbcEventHandler.cpp
       cbits/coin/CbcFathom.cpp
-      cbits/coin/CbcFathomDynamicProgramming.cpp
       cbits/coin/CbcFixVariable.cpp
       cbits/coin/CbcFollowOn.cpp
       cbits/coin/CbcFullNodeInfo.cpp
@@ -350,7 +343,6 @@
       cbits/coin/CbcHeuristicRINS.cpp
       cbits/coin/CbcHeuristicVND.cpp
       cbits/coin/CbcLinked.cpp
-      cbits/coin/CbcLinkedUtils.cpp
       cbits/coin/CbcMessage.cpp
       cbits/coin/CbcMipStartIO.cpp
       cbits/coin/CbcModel.cpp
@@ -375,7 +367,6 @@
       cbits/coin/CbcTree.cpp
       cbits/coin/CbcTreeLocal.cpp
       cbits/coin/Cgl012cut.cpp
-      cbits/coin/CglAllDifferent.cpp
       cbits/coin/CglClique.cpp
       cbits/coin/CglCliqueHelper.cpp
       cbits/coin/CglCutGenerator.cpp
@@ -389,12 +380,9 @@
       cbits/coin/CglLandPMessages.cpp
       cbits/coin/CglLandPSimplex.cpp
       cbits/coin/CglLandPTabRow.cpp
-      cbits/coin/CglLandPTest.cpp
       cbits/coin/CglLandPUtils.cpp
       cbits/coin/CglLandPValidator.cpp
-      cbits/coin/CglLiftAndProject.cpp
       cbits/coin/CglMessage.cpp
-      cbits/coin/CglMixedIntegerRounding.cpp
       cbits/coin/CglMixedIntegerRounding2.cpp
       cbits/coin/CglOddHole.cpp
       cbits/coin/CglParam.cpp
@@ -405,12 +393,10 @@
       cbits/coin/CglRedSplit2Param.cpp
       cbits/coin/CglRedSplitParam.cpp
       cbits/coin/CglResidualCapacity.cpp
-      cbits/coin/CglSimpleRounding.cpp
       cbits/coin/CglStored.cpp
       cbits/coin/CglTreeInfo.cpp
       cbits/coin/CglTwomir.cpp
       cbits/coin/CglZeroHalf.cpp
-      cbits/coin/Clp_C_Interface.cpp
       cbits/coin/ClpCholeskyBase.cpp
       cbits/coin/ClpCholeskyDense.cpp
       cbits/coin/ClpConstraint.cpp
@@ -419,13 +405,9 @@
       cbits/coin/ClpDualRowDantzig.cpp
       cbits/coin/ClpDualRowPivot.cpp
       cbits/coin/ClpDualRowSteepest.cpp
-      cbits/coin/ClpDummyMatrix.cpp
-      cbits/coin/ClpDynamicExampleMatrix.cpp
       cbits/coin/ClpDynamicMatrix.cpp
       cbits/coin/ClpEventHandler.cpp
       cbits/coin/ClpFactorization.cpp
-      cbits/coin/ClpGubDynamicMatrix.cpp
-      cbits/coin/ClpGubMatrix.cpp
       cbits/coin/ClpHelperFunctions.cpp
       cbits/coin/ClpInterior.cpp
       cbits/coin/ClpLinearObjective.cpp
@@ -454,7 +436,6 @@
       cbits/coin/ClpSimplexOther.cpp
       cbits/coin/ClpSimplexPrimal.cpp
       cbits/coin/ClpSolve.cpp
-      cbits/coin/CoinAlloc.cpp
       cbits/coin/CoinBuild.cpp
       cbits/coin/CoinDenseFactorization.cpp
       cbits/coin/CoinDenseVector.cpp
@@ -479,8 +460,6 @@
       cbits/coin/CoinPackedMatrix.cpp
       cbits/coin/CoinPackedVector.cpp
       cbits/coin/CoinPackedVectorBase.cpp
-      cbits/coin/CoinParam.cpp
-      cbits/coin/CoinParamUtils.cpp
       cbits/coin/CoinPostsolveMatrix.cpp
       cbits/coin/CoinPrePostsolveMatrix.cpp
       cbits/coin/CoinPresolveDoubleton.cpp
@@ -531,6 +510,12 @@
   type:     exitcode-stdio-1.0
   hs-source-dirs: examples
   main-is: Test.hs
+  other-modules:
+                Base
+                Clustering
+                Infeasible
+                Simple
+                Stupid
   build-depends: base, limp, limp-cbc
   default-language: Haskell2010
   default-extensions:       TemplateHaskell TypeFamilies FlexibleContexts GeneralizedNewtypeDeriving DataKinds GADTs RankNTypes StandaloneDeriving
