00001 #include <fstream>
00002 #include <cmath>
00003 #include "MCF1_data.hpp"
00004
00005
00006
00007 void MCF1_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 MCF1_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 MCF1_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