1// Copyright (C) 2000, International Business Machines
2// Corporation and others. All Rights Reserved.
3// This code is licensed under the terms of the Eclipse Public License (EPL).
4
5#if defined(_MSC_VER)
6// Turn off compiler warning about long names
7# pragma warning(disable:4786)
8#endif
9
10#include "OsiColCut.hpp"
11#include <cstdlib>
12#include <cstdio>
13#include <iostream>
14
15//-------------------------------------------------------------------
16// Default Constructor
17//-------------------------------------------------------------------
18OsiColCut::OsiColCut() :
19 OsiCut(),
20 lbs_(),
21 ubs_()
22{
23 // nothing to do here
24}
25//-------------------------------------------------------------------
26// Copy constructor
27//-------------------------------------------------------------------
28OsiColCut::OsiColCut(const OsiColCut & source) :
29 OsiCut(source),
30 lbs_(source.lbs_),
31 ubs_(source.ubs_)
32{
33 // Nothing to do here
34}
35
36
37//----------------------------------------------------------------
38// Clone
39//----------------------------------------------------------------
40OsiColCut * OsiColCut::clone() const
41{ return (new OsiColCut(*this)); }
42
43//-------------------------------------------------------------------
44// Destructor
45//-------------------------------------------------------------------
46OsiColCut::~OsiColCut ()
47{
48 // Nothing to do here
49}
50
51//----------------------------------------------------------------
52// Assignment operator
53//-------------------------------------------------------------------
54OsiColCut &
55OsiColCut::operator=(const OsiColCut& rhs)
56{
57 if (this != &rhs) {
58
59 OsiCut::operator=(rhs);
60 lbs_=rhs.lbs_;
61 ubs_=rhs.ubs_;
62 }
63 return *this;
64}
65//----------------------------------------------------------------
66// Print
67//-------------------------------------------------------------------
68
69void
70OsiColCut::print() const
71{
72 const CoinPackedVector & cutLbs = lbs();
73 const CoinPackedVector & cutUbs = ubs();
74 int i;
75 std::cout<<"Column cut has "
76 <<cutLbs.getNumElements()
77 <<" lower bound cuts and "
78 <<cutUbs.getNumElements()
79 <<" upper bound cuts"
80 <<std::endl;
81 for ( i=0; i<cutLbs.getNumElements(); i++ ) {
82 int colIndx = cutLbs.getIndices()[i];
83 double newLb= cutLbs.getElements()[i];
84 std::cout<<"[ x"<<colIndx<<" >= "<<newLb<<"] ";
85 }
86 for ( i=0; i<cutUbs.getNumElements(); i++ ) {
87 int colIndx = cutUbs.getIndices()[i];
88 double newUb= cutUbs.getElements()[i];
89 std::cout<<"[ x"<<colIndx<<" <= "<<newUb<<"] ";
90 }
91 std::cout<<std::endl;
92}
93/* Returns infeasibility of the cut with respect to solution
94 passed in i.e. is positive if cuts off that solution.
95 solution is getNumCols() long..
96*/
97double
98OsiColCut::violated(const double * solution) const
99{
100 const CoinPackedVector & cutLbs = lbs();
101 const CoinPackedVector & cutUbs = ubs();
102 double sum=0.0;
103 int i;
104 const int * column = cutLbs.getIndices();
105 int number = cutLbs.getNumElements();
106 const double * bound = cutLbs.getElements();
107 for ( i=0; i<number; i++ ) {
108 int colIndx = column[i];
109 double newLb = bound[i];
110 if (newLb>solution[colIndx])
111 sum += newLb - solution[colIndx];
112 }
113 column = cutUbs.getIndices();
114 number = cutUbs.getNumElements();
115 bound = cutUbs.getElements();
116 for ( i=0; i<number; i++ ) {
117 int colIndx = column[i];
118 double newUb = bound[i];
119 if (newUb<solution[colIndx])
120 sum += solution[colIndx] - newUb;
121 }
122 return sum;
123}
124