/home/coin/SVN-release/OS-2.2.0/Bcp/examples/MCF-2/Member/MCF2_data.cpp

Go to the documentation of this file.
00001 #include <fstream>
00002 #include <cmath>
00003 #include "MCF2_data.hpp"
00004 
00005 //#############################################################################
00006 
00007 void MCF2_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 MCF2_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   #    Here is the method that reads in the input file
00060   #############################################################################
00061 */
00062 
00063 int MCF2_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 

Generated on Thu Aug 5 03:02:51 2010 by  doxygen 1.4.7