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

Last change on this file since 1665 was 1665, checked in by lou, 9 years ago

Add EPL license notice in src.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 5.5 KB
Line 
1/* $Id: MyMessageHandler.cpp 1665 2011-01-04 17:55:54Z lou $ */
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#pragma warning(disable:4786)
8#pragma warning(disable:4503)
9#endif
10
11#include <cstdio>
12
13#include "ClpSimplex.hpp"
14#include "ClpNonLinearCost.hpp"
15#include "MyMessageHandler.hpp"
16#include "ClpMessage.hpp"
17
18
19//#############################################################################
20// Constructors / Destructor / Assignment
21//#############################################################################
22
23//-------------------------------------------------------------------
24// Default Constructor
25//-------------------------------------------------------------------
26MyMessageHandler::MyMessageHandler ()
27     : CoinMessageHandler(),
28       model_(NULL),
29       feasibleExtremePoints_(),
30       iterationNumber_(-1)
31{
32}
33
34//-------------------------------------------------------------------
35// Copy constructor
36//-------------------------------------------------------------------
37MyMessageHandler::MyMessageHandler (const MyMessageHandler & rhs)
38     : CoinMessageHandler(rhs),
39       model_(rhs.model_),
40       feasibleExtremePoints_(rhs.feasibleExtremePoints_),
41       iterationNumber_(rhs.iterationNumber_)
42{
43}
44
45MyMessageHandler::MyMessageHandler (const CoinMessageHandler & rhs)
46     : CoinMessageHandler(rhs),
47       model_(NULL),
48       feasibleExtremePoints_(),
49       iterationNumber_(-1)
50{
51}
52
53// Constructor with pointer to model
54MyMessageHandler::MyMessageHandler(ClpSimplex * model,
55                                   FILE * /*userPointer*/)
56     : CoinMessageHandler(),
57       model_(model),
58       feasibleExtremePoints_(),
59       iterationNumber_(-1)
60{
61}
62
63//-------------------------------------------------------------------
64// Destructor
65//-------------------------------------------------------------------
66MyMessageHandler::~MyMessageHandler ()
67{
68}
69
70//----------------------------------------------------------------
71// Assignment operator
72//-------------------------------------------------------------------
73MyMessageHandler &
74MyMessageHandler::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//-------------------------------------------------------------------
87CoinMessageHandler * MyMessageHandler::clone() const
88{
89     return new MyMessageHandler(*this);
90}
91
92int
93MyMessageHandler::print()
94{
95     if (currentSource() == "Clp") {
96          if (currentMessage().externalNumber() == 102) {
97               printf("There are %d primal infeasibilities\n",
98                      model_->nonLinearCost()->numberInfeasibilities());
99               // Feasibility
100               if (!model_->nonLinearCost()->numberInfeasibilities()) {
101                    // Column solution
102                    int numberColumns = model_->numberColumns();
103                    const double * solution = model_->solutionRegion(1);
104
105                    // Create vector to contain solution
106                    StdVectorDouble feasibleExtremePoint;
107
108                    const double *objective = model_->objective();
109                    double objectiveValue = 0;
110
111                    if (!model_->columnScale()) {
112                         // No scaling
113                         for (int i = 0; i < numberColumns; i++) {
114                              feasibleExtremePoint.push_back(solution[i]);
115                              objectiveValue += solution[i] * objective[i];
116                         }
117                    } else {
118                         // scaled
119                         const double * columnScale = model_->columnScale();
120                         for (int i = 0; i < numberColumns; i++) {
121                              feasibleExtremePoint.push_back(solution[i]*columnScale[i]);
122                              objectiveValue += solution[i] * objective[i] * columnScale[i];
123                         }
124                    }
125                    std::cout << "Objective " << objectiveValue << std::endl;
126                    // Save solution
127                    feasibleExtremePoints_.push_front(feasibleExtremePoint);
128
129                    // Want maximum of 10 solutions, so if more then 10 get rid of oldest
130                    int numExtremePointsSaved = feasibleExtremePoints_.size();
131                    if ( numExtremePointsSaved >= 10 ) {
132                         feasibleExtremePoints_.pop_back();
133                         assert( feasibleExtremePoints_.size() ==
134                                 static_cast<unsigned int> (numExtremePointsSaved) - 1 );
135                    };
136
137               }
138               return 0; // skip printing
139          }
140     }
141
142     // If one wants access to the message text,
143     // it is available using method messageBuffer().
144     // For example, one could code:
145     // std::cout <<messageBuffer() <<std::endl;
146
147     return CoinMessageHandler::print();
148}
149const ClpSimplex *
150MyMessageHandler::model() const
151{
152     return model_;
153}
154void
155MyMessageHandler::setModel(ClpSimplex * model)
156{
157     model_ = model;
158}
159
160const std::deque<StdVectorDouble> & MyMessageHandler::getFeasibleExtremePoints() const
161{
162     return feasibleExtremePoints_;
163}
164void MyMessageHandler::clearFeasibleExtremePoints()
165{
166     feasibleExtremePoints_.clear();
167}
Note: See TracBrowser for help on using the repository browser.