00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include "psycho-skin-mapgenerator.h"
00033 #include <vector>
00034 #include <iostream>
00035 #include <string>
00036 #include "psycho-skin-mapgenerator.h"
00037 #include <stdio.h>
00038 #include <stdlib.h>
00039 #include <sstream>
00040 #include <time.h>
00041
00042 using namespace std ;
00043
00044 Matrix::Matrix(int row , int col , int** m)
00045 {
00046 mems = *m ;
00047 r = row ;
00048 c = col ;
00049 }
00050
00051
00052 Matrix::~Matrix()
00053
00054 {
00055 delete[] mems;
00056 }
00057
00058 int Matrix::getNumOfRows()
00059 {
00060 return r ;
00061 }
00062
00063 int Matrix::getNumOfColumns()
00064 {
00065 return c ;
00066 }
00067
00068 int Matrix::get(int row , int col)
00069 {
00070 int index = row*c + col ;
00071 return *(mems + index);
00072 }
00073
00074 void Matrix::set(int row , int col , int val)
00075 {
00076 int index = row*c+col ;
00077 *(mems + index) = val ;
00078 }
00079
00080 void Matrix::setNumOfRows(int nr)
00081 {
00082 r = nr ;
00083 }
00084
00085 void Matrix::setNumOfColumns(int nc)
00086 {
00087 c = nc ;
00088 }
00089
00090 string Matrix::toFormattedString()
00091 {
00092 string s("") ;
00093 for (int i = 0 ; i < r ; i++){
00094 s += "<" ;
00095 for(int j = 0 ; j < c ; j++){
00096 int index = i*c + j;
00097 int m = *(mems + index);
00098 s+=stringify(m)+" " ;
00099 }
00100 s += ">" ;
00101 }
00102 return s ;
00103 }
00104
00105 string Matrix::toString()
00106 {
00107 string s("") ;
00108 for (int i = 0 ; i < r ; i++){
00109 for(int j = 0 ; j < c ; j++){
00110 int index = i*c + j;
00111 int m = *(mems + index);
00112 s+=stringify(m)+" " ;
00113 }
00114 }
00115 return s ;
00116 }
00117
00118 string Matrix::stringify(int i)
00119 {
00120 ostringstream o ;
00121 o << i ;
00122 return o.str();
00123 }
00124
00125
00126 Matrix* getARandomMap(int row , int col , int channel)
00127 {
00128
00129 int* a = new int[row*col] ;
00130 srand ( time(NULL) );
00131 for (int i = 0 ; i < row*col ; i++){
00132 a[i] = rand()%channel +1 ;
00133 }
00134 Matrix* matrix= new Matrix(row,col,&a) ;
00135
00136 return matrix ;
00137 }
00138
00139 Matrix* getAnEmptyMap(int row , int col){
00140 int* a = new int[row*col] ;
00141 for (int i = 0 ; i < row*col ; i++){
00142 a[i] = 0 ;
00143 }
00144 Matrix* matrix= new Matrix(row,col,&a) ;
00145
00146 return matrix ;
00147 }
00148
00149
00150 Matrix* getASeededMap(int row , int col , int numOfChannels , Matrix& p , int ch)
00151 {
00152
00153 srand ( time(NULL) );
00154 Matrix* m = getAnEmptyMap(row,col) ;
00155 int ix = rand()%(row - p.getNumOfRows()) ;
00156 int iy = rand()%(col - p.getNumOfColumns()) ;
00157
00158 for(int x = 0 ; x < p.getNumOfRows() ; x++){
00159 for(int y = 0 ; y < p.getNumOfColumns() ; y++){
00160 int f = p.get(x,y);
00161 if( f != 0 ){
00162 m->set(ix+x,iy+y,ch) ;
00163 } else {
00164 int temp = rand()%numOfChannels+1;
00165 while( temp == ch){
00166 temp = rand()%numOfChannels+1;
00167 }
00168 m->set(ix+x,iy+y,temp) ;
00169 }
00170
00171 }
00172 }
00173
00174 for(int i = 0; i < row ; i++){
00175 for(int j = 0 ; j < col ; j++){
00176 if (m->get(i,j) == 0) m->set(i,j,rand()%numOfChannels +1) ;
00177 }
00178 }
00179
00180 return m ;
00181 }
00182
00183
00184 Matrix* getTheChannelMap(Matrix& map , int ch)
00185 {
00186 Matrix *e = getAnEmptyMap(map.getNumOfRows(),map.getNumOfColumns()) ;
00187 for(int i = 0 ; i < map.getNumOfRows() ; i ++){
00188 for (int j = 0 ; j< map.getNumOfColumns() ; j++){
00189 if(map.get(i,j)==ch) e->set(i,j,1) ;
00190 }
00191 }
00192 return e ;
00193 }
00194
00195 int getNumberOfMatches(Matrix& ormap , Matrix& pattern , int channel)
00196 {
00197 int mapRows = ormap.getNumOfRows();
00198 int mapCols = ormap.getNumOfColumns();
00199 int patternRows = pattern.getNumOfRows();
00200 int patternCols = pattern.getNumOfColumns() ;
00201 Matrix* map = getTheChannelMap(ormap , channel);
00202 int result = 0 ;
00203 for(int i = 0 ; i < mapRows ; i++ ){
00204 for(int j = 0 ; j < mapCols ; j++){
00205
00206 bool matchFlag = true ;
00207 if(i+ patternRows <= mapRows && j+ patternCols <= mapCols){
00208 for(int i1 = 0 ; i1 < patternRows ; i1++){
00209 for (int j1 = 0 ; j1 < patternCols ; j1++){
00210 if(pattern.get(i1,j1)> map->get(i+i1,j+j1)) {
00211 matchFlag = false ;
00212 break;
00213 }
00214 if(!matchFlag) break;
00215 }
00216 if(!matchFlag) break;
00217 }
00218
00219 }else{
00220
00221 matchFlag = false ;
00222 }
00223
00224 if(matchFlag){
00225 result++ ;
00226 }
00227
00228 }
00229 }
00230
00231 delete map ;
00232 return result ;
00233 }
00234
00235 Matrix* getMatchMatrix(Matrix& ormap , Matrix& pattern , int channel){
00236 int mapRows = ormap.getNumOfRows();
00237 int mapCols = ormap.getNumOfColumns();
00238 int patternRows = pattern.getNumOfRows();
00239 int patternCols = pattern.getNumOfColumns() ;
00240 Matrix* result = getAnEmptyMap(mapRows,mapCols) ;
00241 Matrix* map = getTheChannelMap(ormap , channel);
00242 for(int i = 0 ; i < mapRows ; i++ ){
00243 for(int j = 0 ; j < mapCols ; j++){
00244
00245 bool matchFlag = true ;
00246 if(i+ patternRows <= mapRows && j+ patternCols <= mapCols){
00247 for(int i1 = 0 ; i1 < patternRows ; i1++){
00248 for (int j1 = 0 ; j1 < patternCols ; j1++){
00249
00250 if(pattern.get(i1,j1)> map->get(i+i1,j+j1) ){
00251 matchFlag = false ;
00252 break;
00253 }
00254 if(!matchFlag) break ;
00255 }
00256 if(!matchFlag) break ;
00257 }
00258
00259 }else{
00260
00261 matchFlag = false ;
00262 }
00263
00264 if(matchFlag){
00265 result->set(i,j,1) ;
00266 }else {result->set(i,j,0) ;}
00267
00268 }
00269 }
00270 delete map ;
00271 return result;
00272
00273 }
00274
00275 Matrix* getPattenByString(std::string patStr){
00276
00277 int rn = 1 ;
00278 int cn = 1 ;
00279 for(int i = 0 ; i< (int)patStr.size() ; i++) if( patStr[i]==char('_')) rn++ ;
00280 if(rn == 1)
00281 {
00282 cn = patStr.size();
00283 }else
00284 {
00285 string::size_type position = patStr.find("_");
00286 cn = int(position) ;
00287 }
00288 Matrix* t = getAnEmptyMap(rn,cn);
00289 for(int i = 0 ; i < rn ; i++)
00290 {
00291 for (int j = 0 ; j < cn ; j++)
00292 {
00293 if(patStr.at( i*(cn+1) + j )=='1') t->set(i,j,1) ;
00294 }
00295
00296 }
00297
00298 return t ;
00299 }
00300
00301
00302
00303 Matrix* getMapByString(std::string mapStr){
00304 int rn = 1 ;
00305 int cn = 1 ;
00306 for(int i = 0 ; i< (int)mapStr.size() ; i++) if( mapStr[i]==char('_')) rn++ ;
00307 if(rn == 1)
00308 {
00309 cn = mapStr.size();
00310 }else
00311 {
00312 string::size_type position = mapStr.find("_");
00313 cn = int(position) ;
00314 }
00315 Matrix* t = getAnEmptyMap(rn,cn);
00316 for(int i = 0 ; i < rn ; i++)
00317 {
00318 for (int j = 0 ; j < cn ; j++)
00319 {
00320 char rf[2] ;
00321 strcpy(rf,mapStr.substr(i*(cn+1) + j ,1 ).c_str());
00322 t->set(i,j,atoi(rf)) ;
00323 }
00324
00325 }
00326
00327 return t ;
00328 }
00329
00330
00331
00332 Matrix* getTranspose(Matrix& m , bool replace)
00333 {
00334 int mRs = m.getNumOfRows() ;
00335 int mCs = m.getNumOfColumns() ;
00336 Matrix* nM = getAnEmptyMap(mCs,mRs);
00337 for(int i = 0 ; i < mRs ; i++){
00338 for(int j = 0 ; j < mCs ; j++){
00339 nM->set(j,i,m.get(i,j)) ;
00340 }
00341 }
00342 if(replace) {
00343 m.setNumOfRows(mCs);
00344 m.setNumOfColumns(mRs) ;
00345 for(int i = 0 ; i < nM->getNumOfRows() ; i++){
00346 for(int j = 0 ; j < nM->getNumOfColumns() ; j++){
00347 m.set(i,j,nM->get(i,j));
00348
00349 }
00350 }
00351 nM->Matrix::~Matrix() ;
00352 return &m ;
00353 }
00354 return nM ;
00355 }
00356
00357 Matrix* getHorizontalReverse(Matrix& m , bool replace)
00358 {
00359 int mRs = m.getNumOfRows() ;
00360 int mCs = m.getNumOfColumns() ;
00361 Matrix* nM = getAnEmptyMap(mRs,mCs);
00362 for(int i = 0 ; i < mRs ; i++){
00363 for(int j = 0 ; j < mCs ; j++){
00364
00365 nM->set(i,j,m.get(mRs-i-1,j)) ;
00366 }
00367 }
00368
00369 if(replace) {
00370 for(int i = 0 ; i < mRs ; i++){
00371 for(int j = 0 ; j < mCs ; j++){
00372 m.set(i,j,nM->get(i,j));
00373
00374 }
00375 }
00376 nM->Matrix::~Matrix() ;
00377 return &m ;
00378 }
00379 return nM ;
00380 }
00381
00382 Matrix* getVerticalReverse(Matrix& m , bool replace)
00383 {
00384 int mRs = m.getNumOfRows() ;
00385 int mCs = m.getNumOfColumns() ;
00386 Matrix* nM = getAnEmptyMap(mRs,mCs);
00387 for(int i = 0 ; i < mRs ; i++){
00388 for(int j = 0 ; j < mCs ; j++){
00389
00390 nM->set(i,j,m.get(i,mCs - j -1)) ;
00391 }
00392 }
00393 if(replace) {
00394 for(int i = 0 ; i < mRs ; i++){
00395 for(int j = 0 ; j < mCs ; j++){
00396 m.set(i,j,nM->get(i,j));
00397
00398 }
00399 }
00400 nM->Matrix::~Matrix() ;
00401 return &m ;
00402 }
00403 return nM ;
00404 }
00405
00406
00407
00408
00409
00410
00411 Matrix* getDominantLinedupFeaturePattern(Matrix& p){
00412
00413 int* colSum = new int[p.getNumOfColumns()] ;
00414 int* rowSum = new int[p.getNumOfRows()] ;
00415 int colSumMax = -1 ;
00416 int rowSumMax = -1 ;
00417 int mRow = 0 ;
00418 int mCol = 0 ;
00419
00420 for( int r = 0 ; r < p.getNumOfRows(); r++ ){
00421 rowSum[r] = 0;
00422 for( int c = 0 ; c < p.getNumOfColumns() ; c++){
00423 rowSum[r] += p.get(r,c);
00424 }
00425 rowSumMax = max(rowSumMax,rowSum[r]);
00426 if(rowSumMax == rowSum[r]) mRow = r ;
00427 }
00428
00429 for( int c = 0 ; c < p.getNumOfColumns() ;c++ ){
00430 colSum[c] = 0 ;
00431 for( int r = 0 ; r < p.getNumOfRows() ; r++ ){
00432 colSum[c] += p.get(r,c) ;
00433 }
00434 colSumMax = max(colSumMax,colSum[c]) ;
00435 if(colSumMax == colSum[c]) mCol = c ;
00436 }
00437
00438 if(colSumMax > rowSumMax){
00439 Matrix* d = getAnEmptyMap(colSumMax , 1) ;
00440 for( int r = 0 ; r < p.getNumOfRows() ; r++){
00441 d->set(r,0,1);
00442 }
00443 delete[] colSum ;
00444 delete[] rowSum ;
00445 return d ;
00446
00447 }else{
00448 Matrix* d = getAnEmptyMap(1,rowSumMax);
00449 for(int c = 0 ; c < p.getNumOfColumns() ; c++ ){
00450 d->set(0,c,1);
00451 }
00452 delete[] colSum ;
00453 delete[] rowSum ;
00454 return d ;
00455 }
00456
00457 }
00458
00459
00460 bool areTheyEqual(Matrix& a , Matrix& b){
00461 int aR = a.getNumOfRows() ;
00462 int aC = a.getNumOfColumns() ;
00463 int bR = b.getNumOfRows() ;
00464 int bC = b.getNumOfColumns() ;
00465 if(aC != bC || aR!=bR ) return false ;
00466 for(int i = 0 ; i < aR ; i++)
00467 {
00468 for(int j = 0 ; j < aC ; j++)
00469 {
00470 if(a.get(i,j)!=b.get(i,j)) return false ;
00471 }
00472 }
00473 return true ;
00474 }
00475
00476 vector<Matrix*> *getAllVariations(Matrix& p)
00477 {
00478
00479 vector<Matrix*>* v = new vector<Matrix*>();
00480 v->push_back(&p) ;
00481
00482 Matrix* p1 = getTranspose(p) ;
00483 if(!isInTheBag(*p1 ,*v)){
00484 v->push_back(p1) ;
00485 }else{
00486 p1->Matrix::~Matrix();
00487 }
00488
00489 Matrix* p2 = getHorizontalReverse(p) ;
00490 if(!isInTheBag(*p2 ,*v)){
00491 v->push_back(p2) ;
00492 }else{
00493 p2->Matrix::~Matrix();
00494 }
00495
00496 Matrix* p3 = getVerticalReverse(p) ;
00497 if(!isInTheBag(*p3 ,*v)){
00498 v->push_back(p3) ;
00499 }else{
00500 p3->Matrix::~Matrix();
00501 }
00502
00503 Matrix* p4 = getVerticalReverse(*(getTranspose(p)),true) ;
00504 if(!isInTheBag(*p4 ,*v)){
00505 v->push_back(p4) ;
00506 }else{
00507 p4->Matrix::~Matrix();
00508 }
00509
00510 Matrix* p5 = getHorizontalReverse(*(getTranspose(p)),true) ;
00511 if(!isInTheBag(*p5 ,*v)){
00512 v->push_back(p5) ;
00513 }else{
00514 p5->Matrix::~Matrix();
00515 }
00516
00517 Matrix* p6 = getVerticalReverse(*(getHorizontalReverse(p)),true) ;
00518 if(!isInTheBag(*p6 ,*v)){
00519 v->push_back(p6) ;
00520 }else{
00521 p6->Matrix::~Matrix();
00522 }
00523
00524 Matrix* p7 = getHorizontalReverse(*(getVerticalReverse(p)),true) ;
00525 if(!isInTheBag(*p7 ,*v)){
00526 v->push_back(p7) ;
00527 }else{
00528 p7->Matrix::~Matrix();
00529 }
00530
00531
00532 Matrix* p8 = getVerticalReverse(*getHorizontalReverse(*(getTranspose(p)),true),true) ;
00533 if(!isInTheBag(*p8 ,*v)){
00534 v->push_back(p8) ;
00535 }else{
00536 p8->Matrix::~Matrix();
00537 }
00538
00539
00540 return v ;
00541 }
00542
00543 bool isInTheBag(Matrix& p , vector<Matrix*>& v)
00544 {
00545 bool flag = false ;
00546 for ( vector<Matrix*>::iterator it=v.begin() ; it < v.end(); it++ )
00547 if(areTheyEqual(*(*it),p))
00548 {
00549 flag = true ;
00550 break;
00551 }
00552
00553 return flag ;
00554 }
00555
00556 int getNumberOfMatchesAgainstAllVariationsForAllChannels(Matrix& map , Matrix& pattern , int numOfChannels)
00557 {
00558 int n= 0 ;
00559 vector<Matrix*> * v = getAllVariations(pattern) ;
00560 for(int c = 1 ; c <= numOfChannels ; c++ ){
00561 for(vector<Matrix*>::iterator it=v->begin() ; it < v->end(); it++){
00562 n += getNumberOfMatches(map ,*(*it) , c);
00563 }
00564
00565 }
00566 return n;
00567 }
00568
00569 vector<Matrix*> *getMapsWithExactPattenAndExactChannel(int rs , int cs , int numOfch , int ch , Matrix& pattern , int numOfMatches , int n )
00570 {
00571 vector<Matrix*>* v = new vector<Matrix*>();
00572
00573
00574
00575 while( (int)(v->size())!=n )
00576 {
00577 Matrix *m ;
00578 if( numOfMatches != 0 ){
00579 m = getASeededMap(rs , cs , numOfch , pattern , ch) ;
00580 }else{
00581 m = getARandomMap(rs , cs , numOfch ) ;
00582
00583 }
00584
00585 if(getNumberOfMatches(*m , pattern , ch) == numOfMatches && !isInTheBag(*m,*v))
00586 {
00587 v->push_back(m) ;
00588 }else{
00589 delete m;
00590
00591 }
00592
00593 }
00594
00595 return v ;
00596
00597 }
00598
00599
00600 vector<Matrix*> *getMapsWithExactPattenAndExactChannelWithExclusionList(int rs , int cs , int numOfch , int ch , Matrix& pattern ,vector<string>& exList, int numOfMatches , int n )
00601 {
00602 vector<Matrix*>* v = new vector<Matrix*>();
00603 vector<Matrix*>* exvector = new vector<Matrix*>() ;
00604 vector<int>::size_type sz = exList.size();
00605 for( uint i = 0 ; i < sz ; i++){
00606 vector<Matrix*>* vars = getAllVariations(*getPattenByString(exList[i]));
00607 vector<int>::size_type vs = vars->size() ;
00608 for( uint j = 0 ; j < vs ; j++ ){
00609 exvector->push_back((*vars)[j]) ;
00610 }
00611 }
00612
00613 while( (int)(v->size())!=n )
00614 {
00615 Matrix *m = getASeededMap(rs , cs , numOfch , pattern , ch) ;
00616 if(getNumberOfMatches(*m , pattern , ch) == numOfMatches && !isInTheBag(*m,*v))
00617 {
00618 bool exFlag = true ;
00619 for( uint i = 0 ; i < exvector->size() ; i++){
00620 for( int j = 0 ; j < numOfch ; j++){
00621 if(getNumberOfMatches(*m,*((*exvector)[i]),j+1)!= 0 )
00622 exFlag = false ;
00623 }
00624 }
00625 if(exFlag) v->push_back(m) ;
00626 }
00627
00628 }
00629 exvector->~vector<Matrix*>() ;
00630 return v ;
00631
00632 }
00633
00634
00635 vector<Matrix*> *getPureMapsWithExactPatternAndExactChannel(int rs , int cs , int numOfch , int ch , Matrix& pattern , int numOfMatches , int n){
00636
00637 vector<Matrix*>* v = new vector<Matrix*>();
00638 Matrix *m ;
00639 Matrix* dominantPattern ;
00640 Matrix* tm = 0;
00641 while( (int)(v->size())!=n )
00642 {
00643
00644 if( numOfMatches != 0 ){
00645 tm = getASeededMap(rs , cs , numOfch , pattern , ch) ;
00646 }else{
00647 tm = getARandomMap(rs , cs , numOfch ) ;
00648 }
00649 dominantPattern = getDominantLinedupFeaturePattern(pattern) ;
00650 if(getNumberOfMatches(*tm , pattern , ch) == numOfMatches && getNumberOfMatches(*tm,*dominantPattern,ch)==numOfMatches && !isInTheBag(*tm,*v))
00651 {
00652 m = getAnEmptyMap(rs,cs) ;
00653 for(int r = 0 ; r < rs ; r++){
00654 for(int c = 0 ; c <cs ; c++){
00655 m->set(r,c,tm->get(r,c));
00656 }
00657 }
00658 v->push_back(m) ;
00659 }
00660 delete dominantPattern ;
00661 delete tm;
00662 }
00663 return v ;
00664
00665 }
00666
00667
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720
00721
00722
00723
00724
00725
00726
00727