COOPY » Guide
version 0.6.5
|
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 }