1 /* $Id: MyMessageHandler.cpp 2385 2019-01-06 19:43:06Z unxusr $ */
2 // Copyright (C) 2003, International Business Machines
3 // Corporation and others. All Rights Reserved.
4 // This code is licensed under the terms of the Eclipse Public License (EPL).
5
6 #if defined(_MSC_VER)
7 // move into CoinPragma.hpp ?
8 #pragma warning(disable : 4503)
9 #endif
10
11 #include <cstdio>
12
13 #include "CoinPragma.hpp"
14 #include "ClpSimplex.hpp"
15 #include "ClpNonLinearCost.hpp"
16 #include "MyMessageHandler.hpp"
17 #include "ClpMessage.hpp"
18
19 //#############################################################################
20 // Constructors / Destructor / Assignment
21 //#############################################################################
22
23 //-------------------------------------------------------------------
24 // Default Constructor
25 //-------------------------------------------------------------------
MyMessageHandler()26 MyMessageHandler::MyMessageHandler()
27 : CoinMessageHandler()
28 , model_(NULL)
29 , feasibleExtremePoints_()
30 , iterationNumber_(-1)
31 {
32 }
33
34 //-------------------------------------------------------------------
35 // Copy constructor
36 //-------------------------------------------------------------------
MyMessageHandler(const MyMessageHandler & rhs)37 MyMessageHandler::MyMessageHandler(const MyMessageHandler &rhs)
38 : CoinMessageHandler(rhs)
39 , model_(rhs.model_)
40 , feasibleExtremePoints_(rhs.feasibleExtremePoints_)
41 , iterationNumber_(rhs.iterationNumber_)
42 {
43 }
44
MyMessageHandler(const CoinMessageHandler & rhs)45 MyMessageHandler::MyMessageHandler(const CoinMessageHandler &rhs)
46 : CoinMessageHandler(rhs)
47 , model_(NULL)
48 , feasibleExtremePoints_()
49 , iterationNumber_(-1)
50 {
51 }
52
53 // Constructor with pointer to model
MyMessageHandler(ClpSimplex * model,FILE *)54 MyMessageHandler::MyMessageHandler(ClpSimplex *model,
55 FILE * /*userPointer*/)
56 : CoinMessageHandler()
57 , model_(model)
58 , feasibleExtremePoints_()
59 , iterationNumber_(-1)
60 {
61 }
62
63 //-------------------------------------------------------------------
64 // Destructor
65 //-------------------------------------------------------------------
~MyMessageHandler()66 MyMessageHandler::~MyMessageHandler()
67 {
68 }
69
70 //----------------------------------------------------------------
71 // Assignment operator
72 //-------------------------------------------------------------------
73 MyMessageHandler &
operator =(const MyMessageHandler & rhs)74 MyMessageHandler::operator=(const MyMessageHandler &rhs)
75 {
76 if (this != &rhs) {
77 CoinMessageHandler::operator=(rhs);
78 model_ = rhs.model_;
79 feasibleExtremePoints_ = rhs.feasibleExtremePoints_;
80 iterationNumber_ = rhs.iterationNumber_;
81 }
82 return *this;
83 }
84 //-------------------------------------------------------------------
85 // Clone
86 //-------------------------------------------------------------------
clone() const87 CoinMessageHandler *MyMessageHandler::clone() const
88 {
89 return new MyMessageHandler(*this);
90 }
91
print()92 int MyMessageHandler::print()
93 {
94 if (currentSource() == "Clp") {
95 if (currentMessage().externalNumber() == 102) {
96 printf("There are %d primal infeasibilities\n",
97 model_->nonLinearCost()->numberInfeasibilities());
98 // Feasibility
99 if (!model_->nonLinearCost()->numberInfeasibilities()) {
100 // Column solution
101 int numberColumns = model_->numberColumns();
102 const double *solution = model_->solutionRegion(1);
103
104 // Create vector to contain solution
105 StdVectorDouble feasibleExtremePoint;
106
107 const double *objective = model_->objective();
108 double objectiveValue = 0;
109
110 if (!model_->columnScale()) {
111 // No scaling
112 for (int i = 0; i < numberColumns; i++) {
113 feasibleExtremePoint.push_back(solution[i]);
114 objectiveValue += solution[i] * objective[i];
115 }
116 } else {
117 // scaled
118 const double *columnScale = model_->columnScale();
119 for (int i = 0; i < numberColumns; i++) {
120 feasibleExtremePoint.push_back(solution[i] * columnScale[i]);
121 objectiveValue += solution[i] * objective[i] * columnScale[i];
122 }
123 }
124 std::cout << "Objective " << objectiveValue << std::endl;
125 // Save solution
126 feasibleExtremePoints_.push_front(feasibleExtremePoint);
127
128 // Want maximum of 10 solutions, so if more then 10 get rid of oldest
129 size_t numExtremePointsSaved = feasibleExtremePoints_.size();
130 if (numExtremePointsSaved >= 10) {
131 feasibleExtremePoints_.pop_back();
132 assert(feasibleExtremePoints_.size() == numExtremePointsSaved - 1);
133 };
134 }
135 return 0; // skip printing
136 }
137 }
138
139 // If one wants access to the message text,
140 // it is available using method messageBuffer().
141 // For example, one could code:
142 // std::cout <<messageBuffer() <<std::endl;
143
144 return CoinMessageHandler::print();
145 }
146 const ClpSimplex *
model() const147 MyMessageHandler::model() const
148 {
149 return model_;
150 }
setModel(ClpSimplex * model)151 void MyMessageHandler::setModel(ClpSimplex *model)
152 {
153 model_ = model;
154 }
155
getFeasibleExtremePoints() const156 const std::deque< StdVectorDouble > &MyMessageHandler::getFeasibleExtremePoints() const
157 {
158 return feasibleExtremePoints_;
159 }
clearFeasibleExtremePoints()160 void MyMessageHandler::clearFeasibleExtremePoints()
161 {
162 feasibleExtremePoints_.clear();
163 }
164
165 /* vi: softtabstop=2 shiftwidth=2 expandtab tabstop=2
166 */
167