Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/moses-smt/mgiza.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'mgizapp/src/model345-peg.cpp')
-rw-r--r--mgizapp/src/model345-peg.cpp191
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;
+}