COOPY » Guide  version 0.6.5
/home/paulfitz/cvs/coopy_scm/coopy/src/libcoopy_core/ColMan.cpp
Go to the documentation of this file.
00001 #include <coopy/ColMan.h>
00002 #include <coopy/FMap.h>
00003 
00004 #include <vector>
00005 
00006 #include <math.h>
00007 
00008 using namespace coopy::cmp;
00009 using namespace std;
00010 
00011 #define FColMap FMultiMap
00012 
00013 #define USE_HEADER 1
00014 
00015 void ColMan::measure(MeasurePass& pass, int ctrl) {
00016   int wa = pass.a.width();
00017   int wb = pass.b.width();
00018   int ha = pass.a.height();
00019   int hb = pass.b.height();
00020 
00021   dbg_printf("Column comparison\n");
00022   pass.clearMatch();
00023 
00024 #ifdef USE_HEADER
00025   if (ha<10 || hb<10) {
00026     pass.va.meta.sniff();
00027     pass.vb.meta.sniff();
00028     if (true) { 
00029       const std::vector<std::string>& anames = pass.va.meta.suggestNames();
00030       const std::vector<std::string>& bnames = pass.vb.meta.suggestNames();
00031       dbg_printf("anames.size() %d wa %d ha %d   bnames.size() %d wb %d hb %d\n",
00032                  anames.size(), wa, ha, bnames.size(), wb, hb);
00033       if (anames.size()==wa && bnames.size()==wb) {
00034         FColMap m(pass.match,hb);
00035         int c = m.getCtrlMax();
00036         for (int i=0; i<wa; i++) {
00037           m.setCurr(i,i);
00038           m.add(anames[i],false,false,c);
00039         }
00040         for (int j=0; j<wb; j++) {
00041           m.setCurr(j,j);
00042           m.add(bnames[j],false,true,c);
00043         }
00044         for (int j=0; j<wb; j++) {
00045           m.setCurr(j,j);
00046           m.add(bnames[j],true,false,c);
00047         }
00048         dbg_printf("added column names to column comparison\n");
00049       }
00050     }
00051   }
00052 #endif
00053 
00054   vector<int> aa;
00055   vector<int> bb;
00056   for (int rb=0; rb<hb; rb++) {
00057     int ra = comp.b2a(rb);
00058     if (ra!=-1) {
00059       aa.push_back(ra);
00060       bb.push_back(rb);
00061     }
00062   }
00063   int hh = (int)aa.size();
00064   if (hh>100) hh = 100;
00065 
00066   int step = (int)(hh/pow(2,ctrl+4));
00067   if (step<1) step = 1;
00068   dbg_printf("Desperation %d, step size %d\n", ctrl, step);
00069   int ct = hh;
00070   for (int rr=0; rr<hh; rr+=step) {
00071     FColMap m(pass.match,hb);
00072     int c = m.getCtrlMax();
00073     int rb = bb[rr];
00074     int ra = aa[rr];
00075     for (int i=0; i<wa; i++) {
00076       m.setCurr(i,i);
00077       m.add(pass.a.cellString(i,ra),false,false,c);
00078     }
00079     for (int j=0; j<wb; j++) {
00080       m.setCurr(j,j);
00081       m.add(pass.b.cellString(j,rb),false,true,c);
00082     }
00083     for (int j=0; j<wb; j++) {
00084       m.setCurr(j,j);
00085       m.add(pass.b.cellString(j,rb),true,false,c);
00086     }
00087   }
00088 
00089 #ifdef USE_HEADER
00090   if (step==1 && (ha<10 || hb<10) && (ct<ha/2||ct<hb/2)) {
00091     pass.va.meta.sniff();
00092     pass.vb.meta.sniff();
00093     const std::vector<std::string>& anames = pass.va.meta.suggestNames();
00094     const std::vector<std::string>& bnames = pass.vb.meta.suggestNames();
00095     FColMap m(pass.match,hb);
00096     int c = m.getCtrlMax();
00097 
00098     if (wa==(int)anames.size()) {
00099       for (int i=0; i<wa; i++) {
00100         m.setCurr(i,i);
00101         m.add(anames[i],false,false,c);
00102       }
00103       for (int rb=0; rb<hb; rb++) {
00104         for (int j=0; j<wb; j++) {
00105           m.setCurr(j,j);
00106           m.add(pass.b.cellString(j,rb),false,true,c);
00107         }
00108       }
00109       for (int rb=0; rb<hb; rb++) {
00110         for (int j=0; j<wb; j++) {
00111           m.setCurr(j,j);
00112           m.add(pass.b.cellString(j,rb),true,false,c);
00113         }
00114       }
00115     }
00116 
00117     if (wb==(int)bnames.size()) {
00118       for (int ra=0; ra<ha; ra++) {
00119         for (int i=0; i<wa; i++) {
00120           m.setCurr(i,i);
00121           m.add(pass.a.cellString(i,ra),false,false,c);
00122         }
00123       }
00124       for (int j=0; j<wb; j++) {
00125         m.setCurr(j,j);
00126         m.add(bnames[j],false,true,c);
00127       }
00128       for (int j=0; j<wb; j++) {
00129         m.setCurr(j,j);
00130         m.add(bnames[j],true,false,c);
00131       }
00132     }
00133   }
00134 #endif
00135   /*
00136   static int ctt = 0;
00137   char buf[256];
00138   sprintf(buf,"/tmp/col_%04d.csv",ctt);
00139   ctt++;
00140   FILE *fout = fopen(buf,"w");
00141   fprintf(fout,"%s\n", pass.match.toString().c_str());
00142   fclose(fout);
00143   */
00144 }
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines