MCF3_data.cpp
Go to the documentation of this file.
1 #include <fstream>
2 #include <cmath>
3 #include "MCF3_data.hpp"
4 
5 //#############################################################################
6 
7 void MCF3_data::pack(BCP_buffer& buf) const
8 {
9  int namelen = strlen(problem_name);
10  buf.pack(problem_name, namelen);
11  buf.pack(numnodes);
12  buf.pack(numarcs);
13  buf.pack(numcommodities);
14  int i;
15  for (i = 0; i < numarcs; ++i) {
16  buf.pack(arcs[i].tail);
17  buf.pack(arcs[i].head);
18  buf.pack(arcs[i].lb);
19  buf.pack(arcs[i].ub);
20  buf.pack(arcs[i].weight);
21  }
22  for (i = 0; i < numcommodities; ++i) {
23  buf.pack(commodities[i].source);
24  buf.pack(commodities[i].sink);
25  buf.pack(commodities[i].demand);
26  }
27 }
28 
29 /*---------------------------------------------------------------------------*/
30 
32 {
33  int namelen;
34  buf.unpack(problem_name, namelen);
35  buf.unpack(numnodes);
36  buf.unpack(numarcs);
38 
39  arcs = new arc[numarcs];
41 
42  int i;
43  for (i = 0; i < numarcs; ++i) {
44  buf.unpack(arcs[i].tail);
45  buf.unpack(arcs[i].head);
46  buf.unpack(arcs[i].lb);
47  buf.unpack(arcs[i].ub);
48  buf.unpack(arcs[i].weight);
49  }
50  for (i = 0; i < numcommodities; ++i) {
51  buf.unpack(commodities[i].source);
52  buf.unpack(commodities[i].sink);
53  buf.unpack(commodities[i].demand);
54  }
55 }
56 
57 /*
58  #############################################################################
59  # Here is the method that reads in the input file
60  #############################################################################
61 */
62 
63 int MCF3_data::readDimacsFormat(std::istream& s, bool addDummyArcs)
64 {
65  double sumweight = 0;
66 
67  bool size_read = true;
68  int arcs_read = 0;
69  int commodities_read = 0;;
70 
71  char line[1000];
72  char name[1000];
73 
74  while (s.good()) {
75  s.getline(line, 1000);
76  if (s.gcount() >= 999) {
77  printf("Input file is incorrect. A line more than 1000 characters is found.\n");
78  return 1;
79  }
80  switch (line[0]) {
81  case 'p':
82  if (sscanf(line, "p%s%i%i%i",
83  name, &numnodes, &numarcs, &numcommodities) != 4) {
84  printf("Input file is incorrect. (p line)\n");
85  return 1;
86  }
87  problem_name = new char[strlen(name)+1];
88  memcpy(problem_name, name, strlen(name)+1);
89  arcs = new arc[numarcs + (addDummyArcs ? numcommodities : 0)];
91  break;
92  case 'c':
93  break;
94  case 'd':
95  if (sscanf(line, "d%i%i%i",
96  &commodities[commodities_read].source,
97  &commodities[commodities_read].sink,
98  &commodities[commodities_read].demand) != 3) {
99  printf("Input file is incorrect. (d line)\n");
100  return 1;
101  }
102  ++commodities_read;
103  break;
104  case 'a':
105  if (sscanf(line, "a%i%i%i%i%lf",
106  &arcs[arcs_read].tail,
107  &arcs[arcs_read].head,
108  &arcs[arcs_read].lb,
109  &arcs[arcs_read].ub,
110  &arcs[arcs_read].weight) != 5) {
111  printf("Input file is incorrect. (a line)\n");
112  return 1;
113  }
114  sumweight += fabs(arcs[arcs_read].weight);
115  ++arcs_read;
116  break;
117  default:
118  if (sscanf(line+1, "%s", name) <= 0) {
119  printf("Input file is incorrect. (non-recognizable line)\n");
120  return 1;
121  }
122  break;
123  }
124  }
125 
126  if (!size_read || arcs_read!=numarcs || commodities_read!=numcommodities) {
127  printf("Input file is incorrect. size_read=%i arcs_read=%i commodities_read=%i\n",
128  size_read, arcs_read, commodities_read);
129  return 1;
130  }
131 
132  if (addDummyArcs) {
133  for (int i = 0; i < numcommodities; ++i) {
136  arcs[numarcs].lb = 0;
138  arcs[numarcs].weight = sumweight+1;
139  ++numarcs;
140  }
141  }
142  return 0;
143 }
144 
145 //#############################################################################
146 
148 {
149  buf.pack(arc_index);
150  buf.pack(lb);
151  buf.pack(ub);
152 }
153 
154 /*---------------------------------------------------------------------------*/
155 
157 {
158  buf.unpack(arc_index);
159  buf.unpack(lb);
160  buf.unpack(ub);
161 }
162 
163 //#############################################################################
164 
165 void MCF3_user::pack(BCP_buffer& buf) const
166 {
167  buf.pack(numCommodities);
168  for (int i = 0; i < numCommodities; ++i) {
169  int s = branch_history[i].size();
170  buf.pack(s);
171  for (int j = 0; j < s; ++j) {
172  branch_history[i][j].pack(buf);
173  }
174  }
175 }
176 
177 /*---------------------------------------------------------------------------*/
178 
180 {
181  delete[] branch_history;
182  buf.unpack(numCommodities);
183  branch_history = new std::vector<MCF3_branch_decision>[numCommodities];
185  for (int i = 0; i < numCommodities; ++i) {
186  int s;
187  buf.unpack(s);
188  for (int j = 0; j < s; ++j) {
189  d.unpack(buf);
190  branch_history[i].push_back(d);
191  }
192  }
193 }
BCP_buffer & pack(const T &value)
Pack a single object of type T.
Definition: BCP_buffer.hpp:177
commodity * commodities
Definition: MCF3_data.hpp:28
void unpack(BCP_buffer &buf)
Definition: MCF3_data.cpp:31
BCP_buffer & unpack(T &value)
Unpack a single object of type T.
Definition: BCP_buffer.hpp:186
int numcommodities
Definition: MCF3_data.hpp:31
arc * arcs
Definition: MCF3_data.hpp:27
static char * j
Definition: OSdtoa.cpp:3622
int numCommodities
Definition: MCF3_data.hpp:72
int numarcs
Definition: MCF3_data.hpp:29
void fint fint fint fint fint fint fint fint fint fint real real real real real real real real * s
void pack(BCP_buffer &buf) const
Definition: MCF3_data.cpp:165
int readDimacsFormat(std::istream &s, bool addDummyArcs)
Definition: MCF3_data.cpp:63
std::vector< MCF3_branch_decision > * branch_history
Definition: MCF3_data.hpp:73
void pack(BCP_buffer &buf) const
Definition: MCF3_data.cpp:147
This class describes the message buffer used for all processes of BCP.
Definition: BCP_buffer.hpp:39
int numnodes
Definition: MCF3_data.hpp:30
void unpack(BCP_buffer &buf)
Definition: MCF3_data.cpp:179
char * problem_name
Definition: MCF3_data.hpp:26
void unpack(BCP_buffer &buf)
Definition: MCF3_data.cpp:156
void pack(BCP_buffer &buf) const
Definition: MCF3_data.cpp:7