2 ***********************************************************
3 $SNARK_Header: S N A R K 1 4 - A PICTURE RECONSTRUCTION PROGRAM $
4 $HeadURL: svn://dig.cs.gc.cuny.edu/snark/trunk/src/snark/quad_adsmos.cpp $
5 $LastChangedRevision: 80 $
6 $Date: 2014-07-01 21:01:54 -0400 (Tue, 01 Jul 2014) $
8 ***********************************************************
10 THIS ROUTINE PERFORMS THE FOUR DIFFERENT SMOOTHING PROCEDURES
11 USED IN THE QUADRATIC OPTIMIZATION ALGORITHM.
22 //pragma message( "to fix!" )
23 /// fix indexes 1 -> 0
25 void quad_class::adsmos(REAL* x, INTEGER m, REAL w1, REAL w2, REAL w3,
31 static const INTEGER hsnar = CHAR2INT('s', 'n', 'a', 'r');
32 static const INTEGER hsajc = CHAR2INT('s', 'a', 'j', 'c');
33 static const INTEGER hkami = CHAR2INT('k', 'a', 'm', 'i');
43 REAL* in = NULL; //wei 3/2005
44 // REAL* ipf; //wei 3/2005
54 // FOR THE KAMI METHOD THE ROUTINE IS EXECUTED TWICE
71 weit4 = (REAL) (w1 + 2.0 * w2 + w3);
72 weit6 = weit4 + w2 + w3;
73 weit9 = (REAL) (weit6 + w2 + 2.0 * w3);
76 // ALLOCATE WORKING SPACE
82 // IPF IS USE FOR SUB FREE ONLY
84 //ipf = ip; wei, 3/2005
86 // SMOOTHING IS DONE M TIMES
90 for (j = 0; j < m; j++)
93 // SMOOTH FIRST ROW OF PICTURE
101 x[0] = w1 * x[0] + w2 * (x[1] + x[n]) + w3 * x[n2];
105 for (i = 1; i < n1; i++)
110 x[i] = w1 * x[i] + w2 * (in[i - 1] + x[i + 1] + x[n + i])
111 + w3 * (x[n1 + i] + x[n2 + i]);
116 x[n1] = w1 * x[n1] + w2 * (in[n1 - 1] + x[n1 + n])
117 + w3 * x[n + n1 - 1];
124 x[0] = (REAL) (w1 * x[0] + w2 * (2.0 * x[0] + x[1] + x[n])
125 + w3 * (x[0] + x[1] + x[n2] + x[n]));
127 for (i = 1; i < n1; i++)
131 x[i] = w1 * x[i] + (w2 + w3) * (in[i - 1] + x[i + 1])
132 + w2 * (x[i] + x[n + i])
133 + w3 * (x[n1 + i] + x[n2 + i]);
137 x[n1] = (REAL) (w1 * x[n1]
138 + w2 * (in[n1 - 1] + 2. * x[n1] + x[n + n1])
139 + w3 * (x[n1] + in[n1 - 1] + x[n1 + n] + x[n1 + n1]));
142 // ROW 2 TO ROW N - 1
150 for (k = 1; k < n1; k++)
157 x[l1] = w1 * x[l1] + w2 * (ip[0] + x[l1 + 1] + x[n + l1])
158 + w3 * (ip[1] + x[l1 + n2]);
161 x[l1] += w2 * (in[0]) + w3 * (ip[0] + x[l1 + n1]);
165 for (i = 1; i < n1; i++)
172 + w2 * (in[i - 1] + x[li + 1] + ip[i] + x[li + n])
174 * (ip[i - 1] + ip[i + 1] + x[li + n1]
181 x[ln] = w1 * x[ln] + w2 * (in[n - 2] + ip[n - 1] + x[ln + n])
182 + w3 * (ip[n - 2] + x[ln + n1]);
187 x[ln] += w2 * in[n1] + w3 * (ip[n1] + x[ln + n]);
196 // IN LAST ROW CHANGE ROLE OF IN AND IP
204 x[l1] = w1 * x[l1] + w2 * (in[0] + x[l1 + 1]) + w3 * (in[1]);
209 for (i = 1; i < n1; i++)
214 x[li] = w1 * x[li] + w2 * (in[i] + ip[i - 1] + x[li + 1])
215 + w3 * (in[i - 1] + in[i + 1]);
221 x[ln] = w1 * x[ln] + w2 * (ip[n1 - 1] + in[n1])
229 x[l1] = (REAL) (w1 * x[l1]
230 + w2 * (2.0 * x[l1] + in[0] + x[l1 + 1])
231 + w3 * (x[l1] + in[1] + in[0] + x[l1 + 1]));
233 for (i = 1; i < n1; i++)
239 x[li] = w1 * x[li] + (w2 + w3) * (ip[i - 1] + x[li + 1])
240 + w2 * (in[i] + x[li])
241 + w3 * (in[i - 1] + in[i + 1]);
245 x[ln] = (REAL) (w1 * x[ln]
246 + w2 * (in[n1] + ip[n1 - 1] + 2.0 * x[ln])
247 + w3 * (x[ln] + in[n - 1] + in[n1 - 1] + ip[n1 - 1]));
251 if ((bcon != hkami) || (kami == 2))
254 // PREPARE FOR SECOND ROUND FOR KAMI
258 for (i = 0; i < n; i++)
266 for (i = 2; i < n; i++)
276 //delete[] ipf; // bug 92 - Lajos - 03/02/2005 wei,3/2005
278 delete[] in; // wei 3/2005