source: src/kor/corr.cc @ 243d027

Last change on this file since 243d027 was 5f4d9c3, checked in by Maciej Prill <mprill@…>, 13 years ago

Rewritten the build system, added lem UTF-8 version.

  • Property mode set to 100644
File size: 3.9 KB
Line 
1//---------------------------------------------------------------------------
2#include "common_cor.h"
3#include "corr.hh"
4
5#define MAXPATH 256
6
7#define min(x,y) ((x<y)?(x):(y))
8#define max(x,y) ((x>y)?(x):(y))
9
10
11Weight Corr::ed(int i,int j)
12{
13  if(i==-1)
14    return (j+1)*CL.cor_stdcor;  // moje*  Nie wiem czy tak bêdzie dobrze, ale uzna³em, ¿e poza tablic¹ powinny byæ wartosci przemno¿one przez wagê standardowej zmiany litery
15  if(j==-1)
16    return (i+1)*CL.cor_stdcor;  // moje*
17  if(i==-2 || j==-2)
18    return (n+1)*CL.cor_stdcor;  // moje*
19
20  if(X[i]==Y[j])
21    return min(H2[i-1][j-1], min(CL.cor_stdcor+min(H2[i][j-1],H2[i-1][j]),CL.GetValue(X,Y,H2,i,j)));
22  if(X[i-1]==Y[j] && X[i]==Y[j-1])
23    return min(min(CL.cor_xchg+H2[i-2][j-2],CL.cor_stdcor+min(H2[i][j-1],H2[i-1][j])), CL.GetValue(X,Y,H2,i,j));
24  return min(CL.cor_stdcor+min(H2[i-1][j-1],min(H2[i][j-1],H2[i-1][j])), CL.GetValue(X,Y,H2,i,j));
25
26/*  // wersja z wagami ale dla floatów
27  if(X[i]==Y[j])//zielone->      <-      niebieskie       ->  <-      rózowe        ->
28    return min(H2[i-1][j-1], min(1+min(H2[i][j-1],H2[i-1][j]),CL.GetValue(X,Y,H2,i,j)));
29  if(X[i-1]==Y[j] && X[i]==Y[j-1])
30    return min(1+min(H2[i-2][j-2],min(H2[i][j-1],H2[i-1][j])), CL.GetValue(X,Y,H2,i,j));
31  return min(1+min(H2[i-1][j-1],min(H2[i][j-1],H2[i-1][j])), CL.GetValue(X,Y,H2,i,j));
32*/
33
34/*  // normalna wersja
35  if(X[i]==Y[j])
36    return H2[i-1][j-1];
37  if(X[i-1]==Y[j] && X[i]==Y[j-1])
38    return 1+min(H2[i-2][j-2],min(H2[i][j-1],H2[i-1][j]));
39  return 1+min(H2[i-1][j-1],min(H2[i][j-1],H2[i-1][j]));
40*/
41
42/*
43  if(X[i]==Y[j])
44    return H[(i-1)+2][(j-1)+2];
45  if(X[i-1]==Y[j] && X[i]==Y[j-1])
46    return 1+min(H[(i-2)+2][(j-2)+2],min(H[(i)+2][(j-1)+2],H[(i-1)+2][(j)+2]));
47  return 1+min(H[(i-1)+2][(j-1)+2],min(H[(i)+2][(j-1)+2],H[(i-1)+2][(j)+2]));
48*/
49}
50
51int Corr::load2(char *Name)  // moje
52{
53  return CL.loadCWL(Name);
54}
55
56Weight Corr::cuted(int j)
57{
58  int l=max(0,j-t);
59  int u=min(m,j+t);
60  Weight ce=(j+t)*PREC;   // moje*
61  for(int k=l;k<=u;k++)
62  {
63    if(H2[k][j]<ce)//if(H[(k)+2][(j)+2]<ce)
64      ce=H2[k][j];//ce=H[(k)+2][(j)+2];
65  }
66  return ce;
67}
68
69/*
70void Corr::recomputeH(int j)
71{
72  for(int i=0;i<=m;i++)
73    H[(i)+2][(j)+2]=ed(i,j);
74}
75*/
76
77void Corr::recomputeH(int j)
78{
79  int lo=max(0,j-t-2); 
80  int hi=min(m,j+t+2); 
81  for(int i=lo;i<=hi;++i)
82    H2[i][j]=ed(i,j);//H[(i)+2][(j)+2]=ed(i,j);
83}
84
85
86int Corr::correct(const char* w, Words& tab)
87{
88  long int path[MAXPATH]={0};
89  int i;                                    // row index (X)
90  int j;                                    // column index (Y)
91  long state=0;
92
93  strcpy(X,w);
94  m=strlen(X)-1;
95  n=m+t;
96
97  for(i=(-2);i<=m;i++)
98    H[(i)+2][(-2)+2]=n*PREC;  // moje *PREC
99  for(i=(-1);i<=m;i++)
100    H[(i)+2][(-1)+2]=((i)+1)*PREC; // moje*
101  for(j=(-2);j<=n;j++)
102    H[(-2)+2][(j)+2]=n*1000;  // moje*
103  for(j=(-1);j<=n;j++)
104    H[(-1)+2][(j)+2]=((j)+1)*PREC;  // moje*
105
106  for(j=0; j<=n; ++j)
107    for(i=0; i<=m; ++i)
108      H[i+2][j+2]=(t+1)*PREC;
109
110  int more=1;
111  bool cont=false;
112
113  strcpy(Y,"");
114  j=0;
115  state=0;
116  int count=0;
117  while(more)
118  {
119    if(!empty(state))
120    {
121      Y[j]=input(state);
122      recomputeH(j);
123      if(cuted(j)<=t)
124      {
125        Weight edd;  // moje
126        if(final(next(state)) && (edd=H[(m)+2][(j)+2])<=t)
127        {
128          char* out=new char[j+2];
129          strncpy(out,Y,j+1);
130          out[j+1]='\0';
131          //          if(cont) putchar(' ');
132          cont=true;
133          //                printf("%1.2f %s\n", (float)edd/PREC,out);  // moje
134          //          cout << out << "(" << edd << ")" << endl;
135                    tab.add(out,(float)edd/PREC);
136          count++;
137        }
138        path[j++]=state;
139        state=next(state);
140        continue;
141      }
142      else
143        if(continued(state))
144        {
145          state++;
146          continue;
147        }
148    }
149    //backtracking
150    do
151      if(j>0)
152        j--;
153      else
154        more=0;
155    while(more && !continued(path[j]));
156    state=path[j]+1;
157  }
158  return count;
159}
160
161
162//---------------------------------------------------------------------------
163
Note: See TracBrowser for help on using the repository browser.