Changeset 133

Show
Ignore:
Timestamp:
04/06/04 18:39:22 (5 years ago)
Author:
ug
Message:

Transcoding patternPY.py

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • 06/devel/pattern.cc

    r83 r133  
    3131// dictionary (int i,int j): ((int k,int l), bool colorSwitch) 
    3232 
    33 Symmetries::Symmetries(int sizeX, int sizeY) { 
    34  
    35 
    36  
    37 void Symmetries::set(int i, int j, int k, int l, int cs) {} 
    38  
    39 int Symmetries::getX(int i, int j) {} 
    40  
    41 int Symmetries::getY(int i, int j) {} 
    42  
    43 char Symmetries::getCS(int i, int j) {} 
    44  
    45 bool Symmetries::has_key(int i, int j) {} 
     33Symmetries::Symmetries(int sX, int sY) { 
     34  sizeX = sX; 
     35  sizeY = sY; 
     36  dataX = new int[sizeX*sizeY]; 
     37  dataY = new int[sizeX*sizeY]; 
     38  dataCS = new int[sizeX*sizeY]; 
     39  for(int i=0; i<sizeX*sizeY; i++) { 
     40    dataX[i] = -1; 
     41    dataY[i] = -1; 
     42    dataCS[i] = -1; 
     43  } 
     44
     45 
     46Symmetries::~Symmetries() { 
     47  delete [] dataX; 
     48  delete [] dataY; 
     49  delete [] dataCS; 
     50
     51 
     52Symmetries::Symmetries(const Symmetries& s) { 
     53  sizeX = s.sizeX; 
     54  // FIXME 
     55
     56 
     57 
     58void Symmetries::set(int i, int j, int k, int l, int cs) { 
     59  if (0 <= i && i < sizeX && 0 <= j && j < sizeY) { 
     60    dataX[i + j*sizeX] = k; 
     61    dataY[i + j*sizeX] = l; 
     62    dataCS[i + j*sizeX] = cs; 
     63  } 
     64  else printf("Error Symmetries\n"); // FIXME 
     65
     66 
     67int Symmetries::getX(int i, int j) { 
     68  if (0 <= i && i < sizeX && 0 <= j && j < sizeY) return dataX[i + j*sizeX]; 
     69  else printf("Error Symmetries\n"); // FIXME 
     70  return -1; 
     71
     72 
     73int Symmetries::getY(int i, int j) { 
     74  if (0 <= i && i < sizeX && 0 <= j && j < sizeY) return dataY[i + j*sizeX]; 
     75  else printf("Error Symmetries\n"); // FIXME 
     76  return -1; 
     77
     78 
     79int Symmetries::getCS(int i, int j) { 
     80  if (0 <= i && i < sizeX && 0 <= j && j < sizeY) return dataCS[i + j*sizeX]; 
     81  else printf("Error Symmetries\n"); // FIXME 
     82  return -1; 
     83
     84 
     85int Symmetries::has_key(int i, int j) { 
     86  if (0 <= i && i < sizeX && 0 <= j && j < sizeY) { 
     87    if (dataX[i + j*sizeX] == -1) return 0; 
     88    else return 1; 
     89  } 
     90  else printf("Error Symmetries\n"); // FIXME 
     91  return 0; 
     92
    4693 
    4794 
     
    94141  bottom = bo; 
    95142 
    96   anchors.sort(); // FIXME 
     143  // anchors.sort(); 
    97144         
    98145  sizeX = sX; 
     
    106153  } 
    107154 
    108   contList = new char[lenCList*4]; 
    109   for(int i=0; i<4*lenClist; i++) contList[i] = cList[i]; 
    110155  lenContList = lenCList; 
    111   for(int i=0; i<lenContList; i++) { 
    112     finalPos[contList[4*i] + sizeX * contList[4*i+1]] = BW2XO(contList[4*i+2]); 
    113   } 
     156  if (lenCList) { 
     157    contList = new char[lenCList*4]; 
     158    for(int i=0; i<4*lenClist; i++) contList[i] = cList[i]; 
     159    for(int i=0; i<lenContList; i++) { 
     160      finalPos[contList[4*i] + sizeX * contList[4*i+1]] = BW2XO(contList[4*i+2]); 
     161    } 
     162  } 
     163  else contList = 0; 
    114164 
    115165  bits = new charp[4]; 
     
    163213} 
    164214 
    165  
    166 // FIXME: need copy constructor?! 
     215Pattern::~Pattern() { 
     216  if (initialPos) delete [] initialPos; 
     217  if (finalPos) delete [] finalPos; 
     218  if (contList) delete [] contList; 
     219  if (bits) delete [] bits; 
     220
     221 
     222Pattern::Pattern(const Pattern& p) { 
     223  left = p.left; 
     224  right = p.right; 
     225  top = p.top; 
     226  bottom = p.bottom; 
     227  sizeX = p.sizeX; 
     228  sizeY = p.sizeY; 
     229  flip = p.flip; 
     230  colorSwitch = p.colorSwitch; 
     231  moveOne = p.moveOne; 
     232  moveTwo = p.moveTwo; 
     233 
     234  initialPos = new char[sizeX*sizeY]; 
     235  finalPos = new char[sizeX*sizeY]; 
     236  for(int i=0; i<sizeX*sizeY; i++) { 
     237    initialPos[i] = p.initialPos[i]; 
     238    finalPos[i] = p.finalPos[i]; 
     239  } 
     240  lenContList = p.lenContList; 
     241  if (lenContList) { 
     242    contList = new char[lenContList*4]; 
     243    for(int i = 0; i < lenContList*4; i++) contList[i] = p.contList[i]; 
     244  } 
     245  else contList = 0; 
     246
     247 
     248Pattern& Pattern::operator=(const Pattern& p) { 
     249  if (&p != this) { 
     250    left = p.left; 
     251    right = p.right; 
     252    top = p.top; 
     253    bottom = p.bottom; 
     254    sizeX = p.sizeX; 
     255    sizeY = p.sizeY; 
     256    flip = p.flip; 
     257    colorSwitch = p.colorSwitch; 
     258    moveOne = p.moveOne; 
     259    moveTwo = p.moveTwo; 
     260 
     261    if (initialPos) delete [] initialPos; 
     262    if (finalPos) delete [] finalPos; 
     263    if (contList) delete [] contList; 
     264    if (bits) delete [] bits; 
     265     
     266    initialPos = new char[sizeX*sizeY]; 
     267    finalPos = new char[sizeX*sizeY]; 
     268    for(int i=0; i<sizeX*sizeY; i++) { 
     269      initialPos[i] = p.initialPos[i]; 
     270      finalPos[i] = p.finalPos[i]; 
     271    } 
     272    lenContList = p.lenContList; 
     273    if (lenContList) { 
     274      contList = new char[lenContList*4]; 
     275      for(int i = 0; i < lenContList*4; i++) contList[i] = p.contList[i]; 
     276    } 
     277    else contList = 0; 
     278 
     279    for(int i=0; i<4; i++) { 
     280      bits[i] = ...; // FIXME 
     281    } 
     282  } 
     283  return *this; 
     284
    167285 
    168286 
     
    222340  vector<Pattern> l(); 
    223341  vector<Pattern> lCS(); 
    224   symmetries
     342  vector<pair<int,int>> sy
    225343         
    226344  int special = -1; 
     
    256374    for(int i=0; i<pattern.sizeX; i++) { 
    257375      for(int j=0; j<pattern.sizeY; j++) { 
    258         newInitialPos[flipsX(f,i,j,boardsize-1,boardsize-1) + pattern.sizeX*flipsY(f,i,j,boardsize-1,boardsize-1)] = 
    259           pattern.getInitial(i, j); 
     376        newInitialPos[flipsX(f,i,j,boardsize-1,boardsize-1) + pattern.sizeX*flipsY(f,i,j,boardsize-1,boardsize-1)] = pattern.getInitial(i, j); 
    260377      } 
    261378    } 
     
    288405    if (foundNewPattern) l.push_back(pNew); 
    289406 
    290     if (pNew == pattern) symmetries.append((ii,0)); // FIXME 
     407    if (pNew == pattern) sy.push_back(pair<int,int>(ii,0)); 
    291408   
    292409    if (nextMove || !fixedColor) { 
     
    331448 
    332449      if (pNew1 == pattern) { 
    333         if (!fixedColor) symmetries.append((f,1)); // FIXME 
     450        if (!fixedColor) sy.push_back(pair<int,int>(f,1)); 
    334451        if (nextMove) special = f; 
    335452      } 
     
    354471      symm.set(i,j,i,j,0); 
    355472 
    356   for(s, c in symmetries) { // FIXME 
     473  vector<pair<int,int>>::iterator it; 
     474  for(it=sy.begin(); it!=sy.end(); it++) { 
     475    int s = it->first; 
     476    int c = it->second; 
    357477    Symmetries symm1; 
    358478 
    359479    for(int i=0; i < pattern.sizeX; i++) { 
    360480      for(int j=0; j < pattern.sizeY; j++) { 
    361         if ((i,j) != Pattern.flips[s](i,j,self.pattern.sizeX-1,self.pattern.sizeY-1) \ 
    362             &&  !symm1.has_key(Pattern.flips[s](i,j,self.pattern.sizeX-1,self.pattern.sizeY-1))) 
    363           symm1[(i,j)] = (Pattern.flips[s](i,j,self.pattern.sizeX-1,self.pattern.sizeY-1), c); 
     481        int fX = flipsX(s, i, j, pattern.sizeX-1, pattern.sizeY-1); 
     482        int fY = flipsY(s, i, j, pattern.sizeX-1, pattern.sizeY-1); 
     483        if (((i != fX || j != fY) && !symm1.has_key(fX, fY)) 
     484          symm1.set(i,j, fX, fY, c); 
    364485      } 
    365486    } 
     
    382503      symm.special = PatternInvFlip(special); 
    383504 
    384     self_symmetries = symm; 
     505    symmetries = symm; 
    385506    return l; 
    386507} 
     
    430551  else cc = 'W'; 
    431552 
    432   int xxN = self_symmetries.getX(xx,yy); 
    433   int yyN = self_symmetries.getY(xx,yy); 
    434   int cSymm = self_symmetries.getCS(xx,yy); 
     553  int xxN = symmetries.getX(xx,yy); 
     554  int yyN = symmetries.getY(xx,yy); 
     555  int cSymm = symmetries.getCS(xx,yy); 
    435556 
    436557  xx = xxN; 
     
    445566    if ((nextMove == 2 && cc == 'B')  
    446567        || (nextMove == 1 && cc == 'W')) { 
    447       if (self_symmetries.special != -1 && !fixedColor) { 
     568      if (symmetries.special != -1 && !fixedColor) { 
    448569 
    449570        if (cc == 'B') cc='W'; 
     
    453574        yy += YY; 
    454575 
    455         xxN = Pattern::flipsX(self_symmetries.special, xx, yy); 
    456         yyN = Pattern::flipsY(self_symmetries.special, xx, yy); 
     576        xxN = Pattern::flipsX(symmetries.special, xx, yy); 
     577        yyN = Pattern::flipsY(symmetries.special, xx, yy); 
    457578        xx = xxN; 
    458579        yy = yyN; 
    459580 
    460         int XX1N = Pattern::flipsX(self_symmetries.special, XX1, YY1); 
    461         int YY1N = Pattern::flipsY(self_symmetries.special, XX1, YY1); 
     581        int XX1N = Pattern::flipsX(symmetries.special, XX1, YY1); 
     582        int YY1N = Pattern::flipsY(symmetries.special, XX1, YY1); 
    462583        XX1 = XX1N; 
    463584        YY1 = YY1N; 
    464585 
    465         int XX2N = Pattern::flipsX(self_symmetries.special, XX2, YY2); 
    466         int YY2N = Pattern::flipsY(self_symmetries.special, XX2, YY2); 
     586        int XX2N = Pattern::flipsX(symmetries.special, XX2, YY2); 
     587        int YY2N = Pattern::flipsY(symmetries.special, XX2, YY2); 
    467588        XX2 = XX2N; 
    468589        YY2 = YY2N; 
     
    474595        yy -= YY; 
    475596                  
    476         int xx1 = self_symmetries.getX(xx,yy); 
    477         int yy1 = self_symmetries.getY(xx,yy); 
    478         int cSymm1 = self_symmetries.getCS(xx,yy); 
     597        int xx1 = symmetries.getX(xx,yy); 
     598        int yy1 = symmetries.getY(xx,yy); 
     599        int cSymm1 = symmetries.getCS(xx,yy); 
    479600         
    480601        if (!cSymm1) { 
  • 06/devel/pattern.h

    r74 r133  
    11typedef charp char*; 
     2 
     3class Symmetries { 
     4  int* dataX; 
     5  int* dataY; 
     6  int* dataCS; 
     7  int sizeX; 
     8  int sizeY; 
     9 public: 
     10  Symmetries(int sX, int sY); 
     11  ~Symmetries(); 
     12  Symmetries(const Symmetries& s); 
     13  Symmetries& operator=(const Symmetries& s); 
     14  void set(int i, int j, int k, int l, int cs); 
     15  int getX(int i, int j); 
     16  int getY(int i, int j); 
     17  int getCS(int i, int j); 
     18  int has_key(int i, int j); 
     19}; 
    220 
    321class Pattern { 
    422 public: 
     23  int left; // left, right, top, bottom "==" anchors 
     24  int right; 
     25  int bottom; 
     26  int top; 
     27  int sizeX; 
     28  int sizeY; 
    529 
    630  int flip, colorSwitch; 
    731  char moveOne, moveTwo; 
     32  charp* bits; 
     33  char* initialPos; 
     34  char* finalPos; 
     35  char* contList; 
     36  int lenContList; 
    837 
    938  Pattern(PyObject* anch, PyObject* initialDict, PyObject* contList, char mOne); 
    10    
     39  Pattern(const Pattern& p); 
     40  ~Pattern(); 
     41  Pattern& operator=(const Pattern& p); 
     42 
    1143  char BW2XO(char c); 
    1244  bool operator==(const &Pattern p); 
     
    1951  int fixedColor, nextMove; 
    2052  vector<Pattern> data; 
     53  Symmetries symmetries; 
    2154 
    2255  PatternList(Pattern p, int fColor, int nMove);