BonFilterWarmStart.cpp
Go to the documentation of this file.
1 // (C) Copyright International Business Machines Corporation, 2006
2 // All Rights Reserved.
3 // This code is published under the Eclipse Public License.
4 //
5 // Authors :
6 // Pierre Bonami, International Business Machines Corporation
7 //
8 // Date : 11/21/2006
9 
10 #include "BonFilterWarmStart.hpp"
11 
12 
13 namespace Bonmin
14 {
15 
17  const real* xArray /*= NULL*/,
18  const fint lamSize /*= 0*/,
19  const real* lamArray /*= NULL*/,
20  const fint lwsSize /*= 0*/,
21  const fint *lwsArray /*= NULL*/,
22  const fint istat[14] /*= def_istat*/)
23  :
24  CoinWarmStartPrimalDual(xSize, lamSize, xArray, lamArray),
25  CoinWarmStartBasis(),
26  lwsSize_(lwsSize),
27  lwsArray_(NULL),
28  empty_(false)
29  {
30  assert(lwsSize > 0 || !lwsArray);
31  if (lwsSize_ > 0) {
32  lwsArray_ = new fint[lwsSize];
33  assert(lwsArray);
34  CoinCopyN(lwsArray, lwsSize, lwsArray_);
35  }
36  for (int i = 0 ; i < 14 ; i ++) {
37  istat_[i] = istat[i];
38  }
39  }
40 
41  /* Copy constructor */
43  :
44  CoinWarmStartPrimalDual(other),
45  CoinWarmStartBasis(other),
46  lwsSize_(other.lwsSize_),
47  lwsArray_(NULL),
48  empty_(other.empty_)
49  {
50  assert(lwsSize_ > 0 || !lwsArray_);
51  if (lwsSize_ > 0) {
52  lwsArray_ = new fint[lwsSize_];
53  assert(other.lwsArray_);
54  CoinCopyN(other.lwsArray_, lwsSize_, lwsArray_);
55  }
56  for (int i = 0 ; i < 14 ; i ++) {
57  istat_[i] = other.istat_[i];
58  }
59  }
60 
62  {
63  delete [] lwsArray_;
64  }
65 
66  CoinWarmStartDiff *
67  FilterWarmStart::generateDiff(const CoinWarmStart * const oldOne) const
68  {
69  const FilterWarmStart * old =
70  dynamic_cast<const FilterWarmStart*> (oldOne);
71  assert(old);
72 
73  CoinWarmStartDiff * diff = CoinWarmStartPrimalDual::generateDiff(old);
74 
75  CoinWarmStartPrimalDualDiff * pdDiff =
76  dynamic_cast<CoinWarmStartPrimalDualDiff*>(diff);
77 
78  FilterWarmStartDiff* retval =
79  new FilterWarmStartDiff(pdDiff, lwsSize_);
80  delete diff;
81 
82  for (fint i = 0 ; i < lwsSize_ ; i++) {
83  if (lwsArray_[i] != old->lwsArray_[i]) {
84  retval->differences.push_back(FilterWarmStartDiff::OneDiff(i, lwsArray_[i] - old->lwsArray_[i]));
85  }
86  }
87 
88  retval->differences.resize(retval->differences.size());
89 
90  for (int i = 0 ; i < 14 ; i++) {
91  retval->istat_[i] = istat_[i];
92  }
93 
94  return retval;
95  }
96 
97  void
98  FilterWarmStart::applyDiff(const CoinWarmStartDiff * diff)
99  {
100  const FilterWarmStartDiff * diffF =
101  dynamic_cast<const FilterWarmStartDiff *>(diff);
102  assert(diffF);
103  CoinWarmStartPrimalDual::applyDiff(diffF);
104 
105  fint end = static_cast<fint>(diffF->differences.size());
106  for (fint i = 0 ; i < end ; i++) {
107  lwsArray_[diffF->differences[i].first] += diffF->differences[i].second;
108  }
109 
110  for (int i = 0 ; i < 14 ; i++)
111  istat_[i] = diffF->istat_[i];
112  }
113 
114  void
116  {
117  delete [] lwsArray_;
118  }
119 
120  FilterWarmStartDiff::FilterWarmStartDiff(CoinWarmStartPrimalDualDiff * diff,
121  fint capacity)
122  :
123  CoinWarmStartPrimalDualDiff()
124  {
125  CoinWarmStartPrimalDualDiff::swap(*diff);
126  differences.reserve(capacity);
127  }
128 
129  void
131  {
132  CoinWarmStartPrimalDualDiff::clear();
133  differences.clear();
134  }
135 
137  FilterWarmStart::def_istat[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
138 
139 
140 } /* End namespace Bonmin */
141 
static Bigint * diff(Bigint *a, Bigint *b)
Definition: OSdtoa.cpp:1120
fint lwsSize() const
Access to lws size.
std::pair< fint, fint > OneDiff
One difference is two integers (indice and difference).
virtual ~FilterWarmStart()
Destructor.
fint end
Warm start for filter interface.
FilterWarmStart(const fint xSize=0, const real *xArray=NULL, const fint lamSize=0, const real *lamArray=NULL, const fint lwsSize=0, const fint *lwsArray=NULL, const fint istat[14]=def_istat)
Constructor.
fint istat_[14]
Filter&#39;s istat (AW: I think we only need first entry)
std::vector< OneDiff > differences
Vector of all the differences.
void fint fint fint fint fint fint fint fint fint fint real real real real real real real real real fint real fint real char real fint fint fint * istat
FORTRAN_INTEGER_TYPE fint
Fortran type for integer used in filter.
virtual CoinWarmStartDiff * generateDiff(const CoinWarmStart *const other) const
Generate differences.
FilterWarmStartDiff(CoinWarmStartPrimalDualDiff *diff, fint capacity)
fint lwsSize_
Size of fint lws array store.
static fint def_istat[14]
Default values for istat.
virtual void applyDiff(const CoinWarmStartDiff *const cswDiff)
Apply differences.
void flushPoint()
flush the starting point
fint * lwsArray_
fint lws array to store