diff options
Diffstat (limited to 'mgizapp/src/model345-peg.cpp')
-rw-r--r-- | mgizapp/src/model345-peg.cpp | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/mgizapp/src/model345-peg.cpp b/mgizapp/src/model345-peg.cpp new file mode 100644 index 0000000..8c1bde6 --- /dev/null +++ b/mgizapp/src/model345-peg.cpp @@ -0,0 +1,191 @@ +/* + +Copyright (C) 2000,2001 Franz Josef Och (RWTH Aachen - Lehrstuhl fuer Informatik VI) + +This file is part of GIZA++ ( extension of GIZA ). + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +USA. + +*/ +#include "model3.h" +#include "collCounts.h" + +bool makeOneMoveSwap(const alignment&x,const alignment&y,set<OneMoveSwap>&soms) +{ + OneMoveSwap oms; + oms.type=0; + int count=0; + Vector<int> positions(4); + assert(x.get_m()==y.get_m()); + for(PositionIndex j=1;j<=x.get_m();j++) + if(x(j)!=y(j)) + { + if(count==4) + return 0; + positions[count]=j; + count++; + } + assert(count>0); + if(count==1) + { + oms.type=1; + oms.a=positions[0]; + oms.b=y(positions[0]); + soms.insert(oms); + for(unsigned int j=1;j<=x.get_m();++j) + { + if( int(j)!=positions[0]&&y(j)==y(positions[0])) + { + oms.type=3; + oms.a=j; + oms.b=x(positions[0]); + soms.insert(oms); + } + } + for(unsigned int j=1;j<=x.get_m();++j) + { + if( int(j)!=positions[0]&&x(j)==x(positions[0])) + { + oms.type=2; + oms.a=positions[0]; + oms.b=j; + if( oms.b<oms.a)swap(oms.b,oms.a); + soms.insert(oms); + } + } + return 1; + } + else if(count==2) + { + if(x(positions[0])==y(positions[1]) && x(positions[1])==y(positions[0])) + { + oms.type=4; + oms.a=positions[0]; + oms.b=positions[1]; + soms.insert(oms); + for(unsigned int j=1;j<=x.get_m();++j) + { + if( int(j)!=positions[0]&&y(j)==y(positions[0])) + { + oms.type=2;oms.a=j;oms.b=positions[1];if( oms.b<oms.a)swap(oms.b,oms.a);soms.insert(oms); + } + if( int(j)!=positions[1]&&y(j)==y(positions[1])) + { + oms.type=2;oms.a=j;oms.b=positions[0];if( oms.b<oms.a)swap(oms.b,oms.a);soms.insert(oms); + } + } + } + else if(x(positions[0])==y(positions[1]) ) + { + oms.type=3; + oms.a=positions[0]; + oms.b=x(positions[1]); + soms.insert(oms); + oms.type=2; + oms.a=positions[0]; + oms.b=positions[1]; + soms.insert(oms); + } + else if( x(positions[1])==y(positions[0]) ) + { + oms.type=3; + oms.a=positions[1]; + oms.b=x(positions[0]); + soms.insert(oms); + oms.type=2; + oms.a=positions[0]; + oms.b=positions[1]; + soms.insert(oms); + } + oms.type=3; + oms.a=positions[0]; + oms.b=x(positions[0]); + soms.insert(oms); + oms.a=positions[1]; + oms.b=x(positions[1]); + soms.insert(oms); + return 1; + } + else if( count==3 ) + { // three differences and three different numbers + Vector<int> xx(3),yy(3); + xx[0]=x(positions[0]);xx[1]=x(positions[1]);xx[2]=x(positions[2]); + yy[0]=y(positions[0]);yy[1]=y(positions[1]);yy[2]=y(positions[2]); + sort(xx.begin(),xx.end()); + sort(yy.begin(),yy.end()); + if(xx==yy) + { + oms.type=2;oms.a=positions[0];oms.b=positions[1];soms.insert(oms); + oms.type=2;oms.a=positions[0];oms.b=positions[2];soms.insert(oms); + oms.type=2;oms.a=positions[1];oms.b=positions[2];soms.insert(oms); + } + else + { + //cout << "HERE.\n"; + if( x(positions[0])==y(positions[1])&&x(positions[1])==y(positions[0]) ) + { + oms.type=2;oms.a=positions[0];oms.b=positions[1]; + if( oms.b<oms.a) swap(oms.b,oms.a); + soms.insert(oms); + oms.type=3;oms.a=positions[2];oms.b=x(positions[2]);soms.insert(oms); + } + if( x(positions[2])==y(positions[1])&&x(positions[1])==y(positions[2]) ) + { + oms.type=2;oms.a=positions[2];oms.b=positions[1]; + if( oms.b<oms.a) swap(oms.b,oms.a); + soms.insert(oms); + oms.type=3;oms.a=positions[0];oms.b=x(positions[0]);soms.insert(oms); + } + if( x(positions[0])==y(positions[2])&&x(positions[2])==y(positions[0]) ) + { + oms.type=2;oms.a=positions[0];oms.b=positions[2]; + if( oms.b<oms.a) swap(oms.b,oms.a); + soms.insert(oms); + oms.type=3;oms.a=positions[1];oms.b=x(positions[1]);soms.insert(oms); + } + } + return 1; + } + else if(count==4) + { + Vector<int> xx(4),yy(4); + for(int i=0;i<4;++i) + { + xx[i]=x(positions[i]); + yy[i]=y(positions[i]); + } + sort(xx.begin(),xx.end()); + sort(yy.begin(),yy.end()); + if(xx==yy) + { + oms.type=2; + for(int j1=0;j1<4;j1++) + for(int j2=j1+1;j2<4;j2++) + { + if(x(positions[j1])!=x(positions[j2])&& + x(positions[j1])==y(positions[j2])&& + x(positions[j2])==y(positions[j1])) + { + oms.type=2;oms.a=positions[j1];oms.b=positions[j2]; + soms.insert(oms); + } + } + } + return 1; + } + else + return 0; +} |