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/alignment.h')
-rw-r--r--mgizapp/src/alignment.h325
1 files changed, 156 insertions, 169 deletions
diff --git a/mgizapp/src/alignment.h b/mgizapp/src/alignment.h
index 03cf028..de6893c 100644
--- a/mgizapp/src/alignment.h
+++ b/mgizapp/src/alignment.h
@@ -8,14 +8,14 @@ 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,
+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,
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
USA.
*/
@@ -32,196 +32,183 @@ Franz Josef Och (30/07/99)
class al_struct
{
- public:
+public:
al_struct()
- : prev(0),next(0){}
+ : prev(0),next(0) {}
PositionIndex prev,next;
};
class alignment
{
- private:
+private:
Vector<PositionIndex> a;
Vector<PositionIndex> positionSum,f;
- public:
+public:
Vector<PositionIndex> als_i;
Vector<al_struct> als_j;
PositionIndex l,m;
alignment()
- {}
+ {}
alignment(PositionIndex _l, PositionIndex _m)
: a(_m+1, (PositionIndex)0),
- positionSum(_l+1, (PositionIndex)0), f(_l+1, (PositionIndex)0), als_i(_l+1,0),als_j(_m+1),l(_l), m(_m)
- {
- f[0]=m;
- for(PositionIndex j=1;j<=m;j++)
- {
- if( j>1 )
- als_j[j].prev= j-1;
- if( j<m )
- als_j[j].next= j+1;
- }
- als_i[0]=1;
- }
- PositionIndex get_l()const
- {return l;}
- PositionIndex get_m()const
- {return m;}
- void doMove(int i,int j)
- {
- set(j,i);
- }
- void doSwap(int j1,int j2)
- {
- int aj1=a[j1],aj2=a[j2];
- set(j1,aj2);
- set(j2,aj1);
- }
- void set(PositionIndex j, PositionIndex aj)
- {
- PositionIndex old_aj=a[j];
- massert(j<a.size());massert(aj<f.size());
- massert(old_aj<f.size());massert(f[old_aj]>0);
- massert(j>0);
- positionSum[old_aj]-=j;
- // ausfuegen
- PositionIndex prev=als_j[j].prev;
- PositionIndex next=als_j[j].next;
- if( next )
- als_j[next].prev=prev;
- if( prev )
- als_j[prev].next=next;
- else
- als_i[old_aj]=next;
-
- // neue Position suchen
- PositionIndex lfd=als_i[aj],llfd=0;
- while( lfd && lfd<j )
- lfd = als_j[llfd=lfd].next;
+ positionSum(_l+1, (PositionIndex)0), f(_l+1, (PositionIndex)0), als_i(_l+1,0),als_j(_m+1),l(_l), m(_m) {
+ f[0]=m;
+ for(PositionIndex j=1; j<=m; j++) {
+ if( j>1 )
+ als_j[j].prev= j-1;
+ if( j<m )
+ als_j[j].next= j+1;
+ }
+ als_i[0]=1;
+ }
+ PositionIndex get_l()const {
+ return l;
+ }
+ PositionIndex get_m()const {
+ return m;
+ }
+ void doMove(int i,int j) {
+ set(j,i);
+ }
+ void doSwap(int j1,int j2) {
+ int aj1=a[j1],aj2=a[j2];
+ set(j1,aj2);
+ set(j2,aj1);
+ }
+ void set(PositionIndex j, PositionIndex aj) {
+ PositionIndex old_aj=a[j];
+ massert(j<a.size());
+ massert(aj<f.size());
+ massert(old_aj<f.size());
+ massert(f[old_aj]>0);
+ massert(j>0);
+ positionSum[old_aj]-=j;
+ // ausfuegen
+ PositionIndex prev=als_j[j].prev;
+ PositionIndex next=als_j[j].next;
+ if( next )
+ als_j[next].prev=prev;
+ if( prev )
+ als_j[prev].next=next;
+ else
+ als_i[old_aj]=next;
- // einfuegen
- als_j[j].prev=llfd;
- als_j[j].next=lfd;
- if( llfd )
- als_j[llfd].next=j;
- else
- als_i[aj]=j;
- if( lfd )
- als_j[lfd].prev=j;
+ // neue Position suchen
+ PositionIndex lfd=als_i[aj],llfd=0;
+ while( lfd && lfd<j )
+ lfd = als_j[llfd=lfd].next;
- f[old_aj]--;
- positionSum[aj]+=j;
- f[aj]++;
- a[j]=aj;
- }
- const Vector<PositionIndex>& getAlignment() const
- {return a ;}
- PositionIndex get_al(PositionIndex j)const
- {
- massert(j<a.size());
- return a[j];
- }
- PositionIndex operator()(PositionIndex j)const
- {
- massert(j<a.size());
- return a[j];
- }
- PositionIndex fert(PositionIndex i)const
- {
- massert(i<f.size());
- return f[i];
- }
- PositionIndex get_head(PositionIndex i)const
- {
- massert( als_i[i]==_get_head(i) );
- return als_i[i];
- }
- PositionIndex get_center(PositionIndex i)const
- {
- if( i==0 )return 0;
- massert(((positionSum[i]+f[i]-1)/f[i]==_get_center(i)));
- return (positionSum[i]+f[i]-1)/f[i];
- }
- PositionIndex _get_head(PositionIndex i)const
- {
- if( fert(i)==0 )return 0;
- for(PositionIndex j=1;j<=m;j++)
- if( a[j]==i )
- return j;
- return 0;
- }
- PositionIndex _get_center(PositionIndex i)const
- {
- if( i==0 )return 0;
- massert(fert(i));
- PositionIndex sum=0;
- for(PositionIndex j=1;j<=m;j++)
- if( a[j]==i )
- sum+=j;
- return (sum+fert(i)-1)/fert(i);
- }
- PositionIndex prev_cept(PositionIndex i)const
- {
- if( i==0 )return 0;
- PositionIndex k=i-1;
- while(k&&fert(k)==0)
- k--;
- return k;
- }
- PositionIndex next_cept(PositionIndex i)const
- {
- PositionIndex k=i+1;
- while(k<l+1&&fert(k)==0)
- k++;
- return k;
- }
- PositionIndex prev_in_cept(PositionIndex j)const
- {
- //PositionIndex k=j-1;
- //while(k&&a[k]!=a[j])
- //k--;
- //assert( als_j[j].prev==k );
- //assert(k);
- //return k;
- massert(als_j[j].prev==0||a[als_j[j].prev]==a[j]);
- return als_j[j].prev;
- }
+ // einfuegen
+ als_j[j].prev=llfd;
+ als_j[j].next=lfd;
+ if( llfd )
+ als_j[llfd].next=j;
+ else
+ als_i[aj]=j;
+ if( lfd )
+ als_j[lfd].prev=j;
+
+ f[old_aj]--;
+ positionSum[aj]+=j;
+ f[aj]++;
+ a[j]=aj;
+ }
+ const Vector<PositionIndex>& getAlignment() const {
+ return a ;
+ }
+ PositionIndex get_al(PositionIndex j)const {
+ massert(j<a.size());
+ return a[j];
+ }
+ PositionIndex operator()(PositionIndex j)const {
+ massert(j<a.size());
+ return a[j];
+ }
+ PositionIndex fert(PositionIndex i)const {
+ massert(i<f.size());
+ return f[i];
+ }
+ PositionIndex get_head(PositionIndex i)const {
+ massert( als_i[i]==_get_head(i) );
+ return als_i[i];
+ }
+ PositionIndex get_center(PositionIndex i)const {
+ if( i==0 )return 0;
+ massert(((positionSum[i]+f[i]-1)/f[i]==_get_center(i)));
+ return (positionSum[i]+f[i]-1)/f[i];
+ }
+ PositionIndex _get_head(PositionIndex i)const {
+ if( fert(i)==0 )return 0;
+ for(PositionIndex j=1; j<=m; j++)
+ if( a[j]==i )
+ return j;
+ return 0;
+ }
+ PositionIndex _get_center(PositionIndex i)const {
+ if( i==0 )return 0;
+ massert(fert(i));
+ PositionIndex sum=0;
+ for(PositionIndex j=1; j<=m; j++)
+ if( a[j]==i )
+ sum+=j;
+ return (sum+fert(i)-1)/fert(i);
+ }
+ PositionIndex prev_cept(PositionIndex i)const {
+ if( i==0 )return 0;
+ PositionIndex k=i-1;
+ while(k&&fert(k)==0)
+ k--;
+ return k;
+ }
+ PositionIndex next_cept(PositionIndex i)const {
+ PositionIndex k=i+1;
+ while(k<l+1&&fert(k)==0)
+ k++;
+ return k;
+ }
+ PositionIndex prev_in_cept(PositionIndex j)const {
+ //PositionIndex k=j-1;
+ //while(k&&a[k]!=a[j])
+ //k--;
+ //assert( als_j[j].prev==k );
+ //assert(k);
+ //return k;
+ massert(als_j[j].prev==0||a[als_j[j].prev]==a[j]);
+ return als_j[j].prev;
+ }
friend ostream &operator<<(ostream&out, const alignment&a);
- friend bool operator==(const alignment&a, const alignment&b)
- {
- massert(a.a.size()==b.a.size());
- for(PositionIndex j=1;j<=a.get_m();j++)
- if(a(j)!=b(j))
- return 0;
- return 1;
- }
- friend bool operator<(const alignment&x, const alignment&y)
- {
- massert(x.get_m()==y.get_m());
- for(PositionIndex j=1;j<=x.get_m();j++)
- if( x(j)<y(j) )
- return 1;
- else if( y(j)<x(j) )
- return 0;
- return 0;
- }
- friend int differences(const alignment&x, const alignment&y){
+ friend bool operator==(const alignment&a, const alignment&b) {
+ massert(a.a.size()==b.a.size());
+ for(PositionIndex j=1; j<=a.get_m(); j++)
+ if(a(j)!=b(j))
+ return 0;
+ return 1;
+ }
+ friend bool operator<(const alignment&x, const alignment&y) {
+ massert(x.get_m()==y.get_m());
+ for(PositionIndex j=1; j<=x.get_m(); j++)
+ if( x(j)<y(j) )
+ return 1;
+ else if( y(j)<x(j) )
+ return 0;
+ return 0;
+ }
+ friend int differences(const alignment&x, const alignment&y) {
int count=0;
massert(x.get_m()==y.get_m());
- for(PositionIndex j=1;j<=x.get_m();j++)
+ for(PositionIndex j=1; j<=x.get_m(); j++)
count += (x(j)!=y(j));
return count;
}
- bool valid()const
- {
- if( 2*f[0]>m )
- return 0;
- for(unsigned int i=1;i<=l;i++)
- if( f[i]>=MAX_FERTILITY )
- return 0;
- return 1;
- }
+ bool valid()const {
+ if( 2*f[0]>m )
+ return 0;
+ for(unsigned int i=1; i<=l; i++)
+ if( f[i]>=MAX_FERTILITY )
+ return 0;
+ return 1;
+ }
friend class transpair_model5;
};
#endif