BCP_obj_change.cpp
Go to the documentation of this file.
1 // Copyright (C) 2000, International Business Machines
2 // Corporation and others. All Rights Reserved.
3 #include <CoinDistance.hpp>
4 #include "BCP_error.hpp"
5 #include "BCP_buffer.hpp"
6 #include "BCP_obj_change.hpp"
7 // #include "BCP_var.hpp"
8 // #include "BCP_cut.hpp"
9 
10 //#############################################################################
11 
12 void
14 {
15  if (objs_change.storage() == BCP_Storage_Explicit){
16  _new_objs.clear();
17  _change.clear();
18  }else{
19  if (objs_change.deleted_num() > 0){
21  objs_change._del_change_pos.begin();
23  objs_change._del_change_pos.entry(objs_change.deleted_num());
24  _new_objs.erase_by_index(firstdel, lastdel);
25  _change.erase_by_index(firstdel, lastdel);
26  }
27  }
28  if (objs_change.added_num() > 0) {
29  _new_objs.append(objs_change._new_objs);
30  _change.append(objs_change._change.entry(objs_change.changed_num() -
31  objs_change.added_num()),
32  objs_change._change.end());
33  }
34  if (objs_change.changed_num() - objs_change.added_num() > 0){
35 #if PARANOID
36  if (objs_change.storage() != BCP_Storage_WrtParent)
37  throw BCP_fatal_error("BCP_obj_set_change::update(): oops\n");
38 #endif
40  objs_change._change.begin();
42  objs_change._change.entry(objs_change.changed_num() -
43  objs_change.added_num());
44  BCP_vec<int>::const_iterator firstchpos =
45  objs_change._del_change_pos.entry(objs_change.deleted_num());
46  while (firstch != lastch) {
47  _change[*firstchpos] = *firstch;
48  ++firstch;
49  ++firstchpos;
50  }
51  }
52 }
53 
54 //=============================================================================
55 
56 void
58 {
59  std::swap(_storage, x._storage);
60  std::swap(_deleted_num, x._deleted_num);
62  _change.swap(x._change);
64 }
65 
66 //=============================================================================
67 
68 int
70 {
71  return ( 5 * sizeof(int) + _del_change_pos.size() * sizeof(int) +
73  _new_objs.size() * sizeof(int) );
74 }
75 
76 //-----------------------------------------------------------------------------
77 
78 void
80 {
81  buf.pack(_storage);
82  buf.pack(_deleted_num);
83  buf.pack(_del_change_pos);
84  buf.pack(_change);
85  buf.pack(_new_objs);
86 }
87 
88 //-----------------------------------------------------------------------------
89 
90 void
92 {
93  buf.unpack(_storage);
94  buf.unpack(_deleted_num);
96  buf.unpack(_change);
97  buf.unpack(_new_objs);
98 }
99 
100 //-----------------------------------------------------------------------------
101 
102 void
104 {
105  printf(" storage: %i\n", _storage);
106  printf(" deleted_num: %i\n", _deleted_num);
107  if (_deleted_num > 0) {
108  printf(" deleted pos:\n");
109  for (int i = 0; i < _deleted_num; ++i) {
110  printf(" %i\n", _del_change_pos[i]);
111  }
112  }
113  int pos = _deleted_num;
114  int chpos = 0;
115  const int changed = _del_change_pos.size() - _deleted_num;
116  if (changed > 0) {
117  printf(" changed pos/newval:\n");
118  for (int chpos = 0; chpos < changed; ++chpos, ++pos) {
119  printf(" pos %i, status %i, lb %f, ub %f\n",
120  _del_change_pos[pos],
121  _change[chpos].stat, _change[chpos].lb, _change[chpos].ub);
122  }
123  }
124  if (added_num() > 0) {
125  printf(" new bcpind/newval:\n");
126  for (int i = 0; i < added_num(); ++i, ++chpos) {
127  printf(" bcpind %i, status %i, lb %f, ub %f\n",
128  _new_objs[i],
129  _change[chpos].stat, _change[chpos].lb, _change[chpos].ub );
130  }
131  }
132 }
133 
134 //#############################################################################
135 #if 0
136 //#############################################################################
137 
138 void
139 BCP_var_set_change::update(const BCP_var_set_change& vars_change)
140 {
141  if (vars_change.storage() == BCP_Storage_Explicit){
142  _new_vars.clear();
143  _change.clear();
144  }else{
145  if (vars_change.deleted_num() > 0){
147  vars_change._del_change_pos.begin();
149  vars_change._del_change_pos.entry(vars_change.deleted_num());
150  _new_vars.erase_by_index(firstdel, lastdel);
151  _change.erase_by_index(firstdel, lastdel);
152  }
153  }
154  if (vars_change.added_num() > 0) {
155  _new_vars.append(vars_change._new_vars);
156  _change.append(vars_change._change.entry(vars_change.changed_num() -
157  vars_change.added_num()),
158  vars_change._change.end());
159  }
160  if (vars_change.changed_num() - vars_change.added_num() > 0){
161 #if PARANOID
162  if (vars_change.storage() != BCP_Storage_WrtParent)
163  throw BCP_fatal_error("BCP_update_varset_and_changes(): oops\n");
164 #endif
166  vars_change._change.begin();
168  vars_change._change.entry(vars_change.changed_num() -
169  vars_change.added_num());
170  BCP_vec<int>::const_iterator firstchpos =
171  vars_change._del_change_pos.entry(vars_change.deleted_num());
172  while (firstch != lastch) {
173  _change[*firstchpos] = *firstch;
174  ++firstch;
175  ++firstchpos;
176  }
177  }
178 }
179 
180 //=============================================================================
181 
182 void
184 {
185  buf.pack(_storage);
186  buf.pack(_deleted_num);
187  buf.pack(_del_change_pos);
188  buf.pack(_change);
189  buf.pack(_new_objs);
190 }
191 
192 //-----------------------------------------------------------------------------
193 
194 void
196 {
197  buf.unpack(_storage);
198  buf.unpack(_deleted_num);
199  buf.unpack(_del_change_pos);
200  buf.unpack(_change);
201  buf.unpack(_new_objs);
202 }
203 
204 //#############################################################################
205 
206 void
207 BCP_cut_set_change::update(const BCP_cut_set_change& cuts_change)
208 {
209  if (cuts_change.storage() == BCP_Storage_Explicit){
210  _new_cuts.clear();
211  _change.clear();
212  }else{
213  if (cuts_change.deleted_num() > 0){
215  cuts_change._del_change_pos.begin();
217  cuts_change._del_change_pos.entry(cuts_change.deleted_num());
218  // BCP_vec<BCP_cut*>& cutset =
219  // dynamic_cast<BCP_vec<BCP_cut*>&>(*this);
220  _new_cuts.erase_by_index(firstdel, lastdel);
221  _change.erase_by_index(firstdel, lastdel);
222  }
223  }
224  if (cuts_change.added_num() > 0) {
225  _new_cuts.append(cuts_change._new_cuts);
226  _change.append(cuts_change._change.entry(cuts_change.changed_num() -
227  cuts_change.added_num()),
228  cuts_change._change.end());
229  }
230  if (cuts_change.changed_num() - cuts_change.added_num() > 0){
231 #if PARANOID
232  if (cuts_change.storage() != BCP_Storage_WrtParent)
233  throw BCP_fatal_error("BCP_update_cutset_and_changes(): oops\n");
234 #endif
236  cuts_change._change.begin();
238  cuts_change._change.entry(cuts_change.changed_num() -
239  cuts_change.added_num());
240  BCP_vec<int>::const_iterator firstchpos =
241  cuts_change._del_change_pos.entry(cuts_change.deleted_num());
242  while (firstch != lastch) {
243  _change[*firstchpos] = *firstch;
244  ++firstch;
245  ++firstchpos;
246  }
247  }
248 }
249 
250 //#############################################################################
251 //#############################################################################
252 
253 BCP_var_set_change::BCP_var_set_change(BCP_vec<BCP_var*>::const_iterator first,
255  _storage(BCP_Storage_Explicit), _deleted_num(0),
256  _del_change_pos(), _change(), _new_vars()
257 {
258  if (first != last) {
259  const int added_var_num = coinDistance(first, last);
260  _change.reserve(added_var_num);
261  _new_vars.reserve(added_var_num);
262  while (first != last) {
263  const BCP_var* var = *first;
265  var->status()));
266  _new_vars.unchecked_push_back(*first);
267  ++first;
268  }
269  }
270 }
271 
272 //-----------------------------------------------------------------------------
273 
274 BCP_var_set_change::
275 BCP_var_set_change(BCP_vec<BCP_var*>::const_iterator first,
277  const BCP_vec<int>& added_bcpind,
278  const BCP_vec<BCP_obj_change>& added_desc) :
279  _storage(BCP_Storage_WrtParent), _deleted_num(0),
280  _del_change_pos(), _change(), _new_vars()
281 {
282  const int new_added_num = coinDistance(first, last);
283  const int old_added_num = added_bcpind.size();
284  _del_change_pos.reserve(old_added_num);
285 
286  BCP_vec<int> chpos;
287  chpos.reserve(new_added_num);
288 
289  int i, j;
290 
291  // first check how many entry has been deleted from oldvars
292  for (i = 0, j = 0; i < new_added_num && j < old_added_num; ++j) {
293  const BCP_var* const var = *(first + i);
294  const BCP_obj_change& added = added_desc[j];
295  if (var->bcpind() == added_bcpind[j]) {
296  // added_bcpind ALWAYS has real indices, so this really separates
297  if (var->lb() != added.lb || var->ub() != added.ub ||
298  var->status() != added.stat)
299  chpos.unchecked_push_back(i);
300  ++i;
301  } else {
303  }
304  }
305  // append the remains of old_added to _del_change_pos
306  for ( ; j < old_added_num; ++j) {
308  }
309  // _deleted_num is the current length of _del_change_pos
311 
312  // the rest are the set of really new vars, and also the position of those
313  // vars must be appended to chpos.
314  _new_vars.reserve(new_added_num - i);
315  for ( ; i < new_added_num; ++i){
316  _new_vars.unchecked_push_back(*(first + i));
317  chpos.unchecked_push_back(i);
318  }
319  // append chpos to _del_change_pos to get the final list
320  _del_change_pos.append(chpos);
321 
322  // finally, create _change: just pick up things based on chpos
323  const int chnum = chpos.size();
324  _change.reserve(chnum);
325  for (i = 0; i < chnum; ++i) {
326  const BCP_var* const var = *(first + chpos[i]);
328  var->status()));
329  }
330 }
331 
332 //-----------------------------------------------------------------------------
333 
334 void
335 BCP_var_set_change::swap(BCP_var_set_change& x)
336 {
337  std::swap(_storage, x._storage);
338  std::swap(_deleted_num, x._deleted_num);
339  _del_change_pos.swap(x._del_change_pos);
340  _change.swap(x._change);
341  _new_vars.swap(x._new_vars);
342 }
343 
344 //-----------------------------------------------------------------------------
345 
346 int
347 BCP_var_set_change::pack_size() const
348 {
349  return ( _del_change_pos.size() * sizeof(int) +
350  _change.size() * BCP_obj_change::pack_size() +
351  _new_vars.size() * (sizeof(bool) + sizeof(int)) );
352 }
353 
354 //#############################################################################
355 
356 BCP_cut_set_change::BCP_cut_set_change(BCP_vec<BCP_cut*>::const_iterator first,
358  _storage(BCP_Storage_Explicit), _deleted_num(0),
359  _del_change_pos(), _change(), _new_cuts()
360 {
361  if (first != last) {
362  const int added_cut_num = coinDistance(first, last);
363  _change.reserve(added_cut_num);
364  _new_cuts.reserve(added_cut_num);
365  while (first != last) {
366  const BCP_cut* cut = *first;
368  cut->status()));
369  _new_cuts.unchecked_push_back(*first);
370  ++first;
371  }
372  }
373 }
374 
375 //-----------------------------------------------------------------------------
376 
377 BCP_cut_set_change::
378 BCP_cut_set_change(BCP_vec<BCP_cut*>::const_iterator first,
380  const BCP_vec<int>& added_bcpind,
381  const BCP_vec<BCP_obj_change>& added_desc) :
382  _storage(BCP_Storage_WrtParent), _deleted_num(0),
383  _del_change_pos(), _change(), _new_cuts()
384 {
385  const int new_added_num = coinDistance(first, last);
386  const int old_added_num = added_bcpind.size();
387  _del_change_pos.reserve(old_added_num);
388 
389  BCP_vec<int> chpos;
390  chpos.reserve(new_added_num);
391 
392  int i, j;
393 
394  // first check how many entry has been deleted from oldcuts
395  for (i = 0, j = 0; i < new_added_num && j < old_added_num; ++j) {
396  const BCP_cut* const cut = *(first + i);
397  const BCP_obj_change& added = added_desc[j];
398  if (cut->bcpind() == added_bcpind[j]) {
399  // added_bcpind ALWAYS has real indices, so this really separates
400  if (cut->lb() != added.lb || cut->ub() != added.ub ||
401  cut->status() != added.stat)
402  chpos.unchecked_push_back(i);
403  ++i;
404  } else {
406  }
407  }
408  // append the remains of old_added to _del_change_pos
409  for ( ; j < old_added_num; ++j) {
411  }
412  // _deleted_num is the current length of _del_change_pos
414 
415  // the rest are the set of really new cuts, and also the position of those
416  // cuts must be appended to chpos.
417  _new_cuts.reserve(new_added_num - i);
418  for ( ; i < new_added_num; ++i){
419  _new_cuts.unchecked_push_back(*(first + i));
420  chpos.unchecked_push_back(i);
421  }
422  // append chpos to _del_change_pos to get the final list
423  _del_change_pos.append(chpos);
424 
425  // finally, create _change: just pick up things based on chpos
426  const int chnum = chpos.size();
427  _change.reserve(chnum);
428  for (i = 0; i < chnum; ++i) {
429  const BCP_cut* const cut = *(first + chpos[i]);
431  cut->status()));
432  }
433 }
434 
435 //-----------------------------------------------------------------------------
436 
437 void
438 BCP_cut_set_change::swap(BCP_cut_set_change& x)
439 {
440  std::swap(_storage, x._storage);
441  std::swap(_deleted_num, x._deleted_num);
442  _del_change_pos.swap(x._del_change_pos);
443  _change.swap(x._change);
444  _new_cuts.swap(x._new_cuts);
445 }
446 
447 //-----------------------------------------------------------------------------
448 
449 int
450 BCP_cut_set_change::pack_size() const
451 {
452  return ( _del_change_pos.size() * sizeof(int) +
453  _change.size() * BCP_obj_change::pack_size() +
454  _new_cuts.size() * (sizeof(bool) + sizeof(int)) );
455 }
456 #endif
This class stores data about how an object set (set of vars or set of cuts) changes.
BCP_buffer & pack(const T &value)
Pack a single object of type T.
Definition: BCP_buffer.hpp:177
BCP_buffer & unpack(T &value)
Unpack a single object of type T.
Definition: BCP_buffer.hpp:186
pos
position where the operator should be printed when printing the expression
void clear()
Delete every entry.
void update(const BCP_obj_set_change &objs_change)
Abstract base class that defines members common to all types of cuts.
Definition: BCP_cut.hpp:29
void pack(BCP_buffer &buf) const
iterator begin()
Return an iterator to the beginning of the object.
Definition: BCP_vector.hpp:99
double ub() const
Return the upper bound on the cut.
Definition: BCP_cut.hpp:84
BCP_vec< int > _new_objs
void reserve(const size_t n)
Reallocate the object to make space for n entries.
static int pack_size()
static char * j
Definition: OSdtoa.cpp:3622
The data stored is an explicit listing of values.
Definition: BCP_enum.hpp:88
void swap(BCP_obj_set_change &x)
double lb() const
Return the lower bound on the cut.
Definition: BCP_cut.hpp:82
BCP_storage_t _storage
BCP_obj_status stat
double ub() const
Return the upper bound.
Definition: BCP_var.hpp:91
int pack_size() const
int changed_num() const
void erase_by_index(const BCP_vec< int > &positions)
Erase the entries indexed by indices.
BCP_obj_status status() const
Return the status of the cut.
Definition: BCP_cut.hpp:91
The data stored is with respect to the same kind of data in the parent of the search tree node...
Definition: BCP_enum.hpp:91
static int
Definition: OSdtoa.cpp:2173
void clear()
Completely clear the buffer.
Definition: BCP_buffer.hpp:168
BCP_storage_t storage() const
Abstract base class that defines members common to all types of variables.
Definition: BCP_var.hpp:28
Currently there isn&#39;t any error handling in BCP.
Definition: BCP_error.hpp:20
int bcpind() const
Return the internal index of the variable.
Definition: BCP_var.hpp:93
size_t size() const
Return the current number of entries.
Definition: BCP_vector.hpp:116
iterator end()
Return an iterator to the end of the object.
Definition: BCP_vector.hpp:104
BCP_obj_status status() const
Return the status of the variable.
Definition: BCP_var.hpp:98
void unpack(BCP_buffer &buf)
The class BCP_vec serves the same purpose as the vector class in the standard template library...
Definition: BCP_vector.hpp:24
This class describes the message buffer used for all processes of BCP.
Definition: BCP_buffer.hpp:39
void unchecked_push_back(const_reference x)
Append x to the end of the vector.
BCP_vec< int > _del_change_pos
int deleted_num() const
double lb() const
Return the lower bound.
Definition: BCP_var.hpp:89
iterator entry(const int i)
Return an iterator to the i-th entry.
Definition: BCP_vector.hpp:109
BCP_vec< BCP_obj_change > _change
int bcpind() const
Return the internal index of the cut.
Definition: BCP_cut.hpp:86
void append(const BCP_vec< T > &x)
Append the entries in x to the end of the vector.
Definition: BCP_vector.hpp:169
void swap(BCP_vec< T > &x)
Exchange the contents of the object with that of x.
int added_num() const
void fint fint fint real fint real * x