source: trunk/Clp/src/MyMessageHandler.cpp @ 1525

Last change on this file since 1525 was 1525, checked in by mjs, 10 years ago

Formatted .cpp, .hpp, .c, .h files with "astyle -A4 -p". This matches the formatting used in the grand CBC reorganization.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 5.4 KB
Line 
1/* $Id: MyMessageHandler.cpp 1525 2010-02-26 17:27:59Z mjs $ */
2// Copyright (C) 2003, International Business Machines
3// Corporation and others.  All Rights Reserved.
4
5#if defined(_MSC_VER)
6#pragma warning(disable:4786)
7#pragma warning(disable:4503)
8#endif
9
10#include <cstdio>
11
12#include "ClpSimplex.hpp"
13#include "ClpNonLinearCost.hpp"
14#include "MyMessageHandler.hpp"
15#include "ClpMessage.hpp"
16
17
18//#############################################################################
19// Constructors / Destructor / Assignment
20//#############################################################################
21
22//-------------------------------------------------------------------
23// Default Constructor
24//-------------------------------------------------------------------
25MyMessageHandler::MyMessageHandler ()
26     : CoinMessageHandler(),
27       model_(NULL),
28       feasibleExtremePoints_(),
29       iterationNumber_(-1)
30{
31}
32
33//-------------------------------------------------------------------
34// Copy constructor
35//-------------------------------------------------------------------
36MyMessageHandler::MyMessageHandler (const MyMessageHandler & rhs)
37     : CoinMessageHandler(rhs),
38       model_(rhs.model_),
39       feasibleExtremePoints_(rhs.feasibleExtremePoints_),
40       iterationNumber_(rhs.iterationNumber_)
41{
42}
43
44MyMessageHandler::MyMessageHandler (const CoinMessageHandler & rhs)
45     : CoinMessageHandler(rhs),
46       model_(NULL),
47       feasibleExtremePoints_(),
48       iterationNumber_(-1)
49{
50}
51
52// Constructor with pointer to model
53MyMessageHandler::MyMessageHandler(ClpSimplex * model,
54                                   FILE * /*userPointer*/)
55     : CoinMessageHandler(),
56       model_(model),
57       feasibleExtremePoints_(),
58       iterationNumber_(-1)
59{
60}
61
62//-------------------------------------------------------------------
63// Destructor
64//-------------------------------------------------------------------
65MyMessageHandler::~MyMessageHandler ()
66{
67}
68
69//----------------------------------------------------------------
70// Assignment operator
71//-------------------------------------------------------------------
72MyMessageHandler &
73MyMessageHandler::operator=(const MyMessageHandler& rhs)
74{
75     if (this != &rhs) {
76          CoinMessageHandler::operator=(rhs);
77          model_ = rhs.model_;
78          feasibleExtremePoints_ = rhs.feasibleExtremePoints_;
79          iterationNumber_ = rhs.iterationNumber_;
80     }
81     return *this;
82}
83//-------------------------------------------------------------------
84// Clone
85//-------------------------------------------------------------------
86CoinMessageHandler * MyMessageHandler::clone() const
87{
88     return new MyMessageHandler(*this);
89}
90
91int
92MyMessageHandler::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                    int numExtremePointsSaved = feasibleExtremePoints_.size();
130                    if ( numExtremePointsSaved >= 10 ) {
131                         feasibleExtremePoints_.pop_back();
132                         assert( feasibleExtremePoints_.size() ==
133                                 static_cast<unsigned int> (numExtremePointsSaved) - 1 );
134                    };
135
136               }
137               return 0; // skip printing
138          }
139     }
140
141     // If one wants access to the message text,
142     // it is available using method messageBuffer().
143     // For example, one could code:
144     // std::cout <<messageBuffer() <<std::endl;
145
146     return CoinMessageHandler::print();
147}
148const ClpSimplex *
149MyMessageHandler::model() const
150{
151     return model_;
152}
153void
154MyMessageHandler::setModel(ClpSimplex * model)
155{
156     model_ = model;
157}
158
159const std::deque<StdVectorDouble> & MyMessageHandler::getFeasibleExtremePoints() const
160{
161     return feasibleExtremePoints_;
162}
163void MyMessageHandler::clearFeasibleExtremePoints()
164{
165     feasibleExtremePoints_.clear();
166}
Note: See TracBrowser for help on using the repository browser.