void CalcMatrix(const vector<CompositeData> data, VVI & RM, VVI & DM, VS & deci_val) { if (data.size() == 0 ) { cerr << "Input data is empty!" << endl; exit(-1); } unsigned int i, j; //Calc Relation Matrix RM.clear(); VI vbTmp(data.size(), 0); RM.insert(RM.begin(), data.size(), vbTmp); for (i = 0; i < data.size(); ++i) { for (j = 0; j < data.size(); ++j) { if (data[i] == data[j]) RM[i][j] = 1; } RM[i][i] = 1; } //Calc Relation Matrix STR2VI_MAP DMap; STR2VI_MAP::iterator it; for (i = 0; i < data.size(); ++i) { it = DMap.find(data[i].d); if (it == DMap.end()) { VI tmp; tmp.push_back(i); DMap.insert(STR2VI_MAP::value_type(data[i].d, tmp)); } else { ((*it).second).push_back(i); } } //DM: n * d //DMap.size() = d DM.clear(); VI viTmp(DMap.size(), 0); DM.insert(DM.begin(), data.size(), viTmp); // cout << DM.size() << "\t" << DM[0].size() << endl; for (i = 0, it = DMap.begin(); it != DMap.end(); ++it, ++i) { deci_val.push_back((*it).first); for (j = 0; j < (*it).second.size(); ++j) { DM[(*it).second[j]][i] = 1; } } DMap.clear(); }
void CalcOmegaMatrix(const VVI & RM, const VVI & DM, VVI & OmegaM) { if (RM.size() == 0 || DM.size() == 0) { cerr << "Size of relation matrix and decison matrix is 0 !" << endl; exit(-1); } //OmegaM: n * d OmegaM.clear(); VI viTmp(DM[0].size(), 0); OmegaM.insert(OmegaM.begin(), RM.size(), viTmp); // cout << OmegaM.size() << "\t" << OmegaM[0].size() <<endl; unsigned int i, j, k; STR2VI_MAP::iterator it; int sum = 0; for (i = 0; i < RM.size(); ++i) { for (j = 0; j < DM[0].size(); ++j) { sum = 0; for (k = 0; k < DM.size(); ++k) { sum += RM[i][k] * DM[k][j]; } OmegaM[i][j] = sum; } } }
bool can(int prefLength,VI& result,bool return_result = false){ result.clear(); vector<Hash> hashes; int n = 1; for(int sn = 0; sn<n;++sn){ HashComputer<mod1> curHash1; HashComputer<mod2> curHash2; for(int i = 0; i < prefLength; ++i){ curHash1.add(a[sn][i]); curHash2.add(a[sn][i]); } hashes.push_back(Hash(make_pair(curHash1.value,curHash2.value),sn,0)); for(int i = prefLength; i < a[sn].size(); ++i){ curHash1.shift(a[sn][i-prefLength],a[sn][i],prefLength); curHash2.shift(a[sn][i-prefLength],a[sn][i],prefLength); hashes.push_back(Hash(make_pair(curHash1.value,curHash2.value),sn,i-prefLength+1)); } } sort(hashes.begin(),hashes.end()); //hashes.resize(unique(hashes.begin(),hashes.end(),EqualString())-hashes.begin()); VVI results; for(int i = k-1; i < hashes.size();++i) if(hashes[i].equals(hashes[i-k+1])){ if(return_result == true){ results.push_back(VI()); int k = results.size()-1; for(int j = i-n+1; j <=i;++j) results[k].push_back(hashes[j].pos); } else return true; } if(return_result == true){ result = *min_element(results.begin(),results.end()); return true; } return false; }