00001 #include <fstream>
00002 #include <cmath>
00003 #include "MCF3_data.hpp"
00004
00005
00006
00007 void MCF3_data::pack(BCP_buffer& buf) const
00008 {
00009 int namelen = strlen(problem_name);
00010 buf.pack(problem_name, namelen);
00011 buf.pack(numnodes);
00012 buf.pack(numarcs);
00013 buf.pack(numcommodities);
00014 int i;
00015 for (i = 0; i < numarcs; ++i) {
00016 buf.pack(arcs[i].tail);
00017 buf.pack(arcs[i].head);
00018 buf.pack(arcs[i].lb);
00019 buf.pack(arcs[i].ub);
00020 buf.pack(arcs[i].weight);
00021 }
00022 for (i = 0; i < numcommodities; ++i) {
00023 buf.pack(commodities[i].source);
00024 buf.pack(commodities[i].sink);
00025 buf.pack(commodities[i].demand);
00026 }
00027 }
00028
00029
00030
00031 void MCF3_data::unpack(BCP_buffer& buf)
00032 {
00033 int namelen;
00034 buf.unpack(problem_name, namelen);
00035 buf.unpack(numnodes);
00036 buf.unpack(numarcs);
00037 buf.unpack(numcommodities);
00038
00039 arcs = new arc[numarcs];
00040 commodities = new commodity[numcommodities];
00041
00042 int i;
00043 for (i = 0; i < numarcs; ++i) {
00044 buf.unpack(arcs[i].tail);
00045 buf.unpack(arcs[i].head);
00046 buf.unpack(arcs[i].lb);
00047 buf.unpack(arcs[i].ub);
00048 buf.unpack(arcs[i].weight);
00049 }
00050 for (i = 0; i < numcommodities; ++i) {
00051 buf.unpack(commodities[i].source);
00052 buf.unpack(commodities[i].sink);
00053 buf.unpack(commodities[i].demand);
00054 }
00055 }
00056
00057
00058
00059
00060
00061
00062
00063 int MCF3_data::readDimacsFormat(std::istream& s, bool addDummyArcs)
00064 {
00065 double sumweight = 0;
00066
00067 bool size_read = true;
00068 int arcs_read = 0;
00069 int commodities_read = 0;;
00070
00071 char line[1000];
00072 char name[1000];
00073
00074 while (s.good()) {
00075 s.getline(line, 1000);
00076 if (s.gcount() >= 999) {
00077 printf("Input file is incorrect. A line more than 1000 characters is found.\n");
00078 return 1;
00079 }
00080 switch (line[0]) {
00081 case 'p':
00082 if (sscanf(line, "p%s%i%i%i",
00083 name, &numnodes, &numarcs, &numcommodities) != 4) {
00084 printf("Input file is incorrect. (p line)\n");
00085 return 1;
00086 }
00087 problem_name = new char[strlen(name)+1];
00088 memcpy(problem_name, name, strlen(name)+1);
00089 arcs = new arc[numarcs + (addDummyArcs ? numcommodities : 0)];
00090 commodities = new commodity[numcommodities];
00091 break;
00092 case 'c':
00093 break;
00094 case 'd':
00095 if (sscanf(line, "d%i%i%i",
00096 &commodities[commodities_read].source,
00097 &commodities[commodities_read].sink,
00098 &commodities[commodities_read].demand) != 3) {
00099 printf("Input file is incorrect. (d line)\n");
00100 return 1;
00101 }
00102 ++commodities_read;
00103 break;
00104 case 'a':
00105 if (sscanf(line, "a%i%i%i%i%lf",
00106 &arcs[arcs_read].tail,
00107 &arcs[arcs_read].head,
00108 &arcs[arcs_read].lb,
00109 &arcs[arcs_read].ub,
00110 &arcs[arcs_read].weight) != 5) {
00111 printf("Input file is incorrect. (a line)\n");
00112 return 1;
00113 }
00114 sumweight += fabs(arcs[arcs_read].weight);
00115 ++arcs_read;
00116 break;
00117 default:
00118 if (sscanf(line+1, "%s", name) <= 0) {
00119 printf("Input file is incorrect. (non-recognizable line)\n");
00120 return 1;
00121 }
00122 break;
00123 }
00124 }
00125
00126 if (!size_read || arcs_read!=numarcs || commodities_read!=numcommodities) {
00127 printf("Input file is incorrect. size_read=%i arcs_read=%i commodities_read=%i\n",
00128 size_read, arcs_read, commodities_read);
00129 return 1;
00130 }
00131
00132 if (addDummyArcs) {
00133 for (int i = 0; i < numcommodities; ++i) {
00134 arcs[numarcs].tail = commodities[i].source;
00135 arcs[numarcs].head = commodities[i].sink;
00136 arcs[numarcs].lb = 0;
00137 arcs[numarcs].ub = commodities[i].demand;
00138 arcs[numarcs].weight = sumweight+1;
00139 ++numarcs;
00140 }
00141 }
00142 return 0;
00143 }
00144
00145
00146
00147 void MCF3_branch_decision::pack(BCP_buffer& buf) const
00148 {
00149 buf.pack(arc_index);
00150 buf.pack(lb);
00151 buf.pack(ub);
00152 }
00153
00154
00155
00156 void MCF3_branch_decision::unpack(BCP_buffer& buf)
00157 {
00158 buf.unpack(arc_index);
00159 buf.unpack(lb);
00160 buf.unpack(ub);
00161 }
00162
00163
00164
00165 void MCF3_user::pack(BCP_buffer& buf) const
00166 {
00167 buf.pack(numCommodities);
00168 for (int i = 0; i < numCommodities; ++i) {
00169 int s = branch_history[i].size();
00170 buf.pack(s);
00171 for (int j = 0; j < s; ++j) {
00172 branch_history[i][j].pack(buf);
00173 }
00174 }
00175 }
00176
00177
00178
00179 void MCF3_user::unpack(BCP_buffer& buf)
00180 {
00181 delete[] branch_history;
00182 buf.unpack(numCommodities);
00183 branch_history = new std::vector<MCF3_branch_decision>[numCommodities];
00184 MCF3_branch_decision d;
00185 for (int i = 0; i < numCommodities; ++i) {
00186 int s;
00187 buf.unpack(s);
00188 for (int j = 0; j < s; ++j) {
00189 d.unpack(buf);
00190 branch_history[i].push_back(d);
00191 }
00192 }
00193 }