00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include <math.h>
00016
00017 namespace ROOT {
00018
00019 namespace Minuit2 {
00020
00021
00022 int mneigen(double* a, unsigned int ndima, unsigned int n, unsigned int mits,
00023 double* work, double precis) {
00024
00025
00026
00027 unsigned int a_dim1, a_offset, i__1, i__2, i__3;
00028 double r__1, r__2;
00029
00030
00031 double b, c__, f, h__;
00032 unsigned int i__, j, k, l, m = 0;
00033 double r__, s;
00034 unsigned int i0, i1, j1, m1, n1;
00035 double hh, gl, pr, pt;
00036
00037
00038
00039
00040 a_dim1 = ndima;
00041 a_offset = 1 + a_dim1 * 1;
00042 a -= a_offset;
00043 --work;
00044
00045
00046 int ifault = 1;
00047
00048 i__ = n;
00049 i__1 = n;
00050 for (i1 = 2; i1 <= i__1; ++i1) {
00051 l = i__ - 2;
00052 f = a[i__ + (i__ - 1) * a_dim1];
00053 gl = (double)0.;
00054
00055 if (l < 1) {
00056 goto L25;
00057 }
00058
00059 i__2 = l;
00060 for (k = 1; k <= i__2; ++k) {
00061
00062 r__1 = a[i__ + k * a_dim1];
00063 gl += r__1 * r__1;
00064 }
00065 L25:
00066
00067 r__1 = f;
00068 h__ = gl + r__1 * r__1;
00069
00070 if (gl > (double)1e-35) {
00071 goto L30;
00072 }
00073
00074 work[i__] = (double)0.;
00075 work[n + i__] = f;
00076 goto L65;
00077 L30:
00078 ++l;
00079
00080 gl = sqrt(h__);
00081
00082 if (f >= (double)0.) {
00083 gl = -gl;
00084 }
00085
00086 work[n + i__] = gl;
00087 h__ -= f * gl;
00088 a[i__ + (i__ - 1) * a_dim1] = f - gl;
00089 f = (double)0.;
00090 i__2 = l;
00091 for (j = 1; j <= i__2; ++j) {
00092 a[j + i__ * a_dim1] = a[i__ + j * a_dim1] / h__;
00093 gl = (double)0.;
00094 i__3 = j;
00095 for (k = 1; k <= i__3; ++k) {
00096 gl += a[j + k * a_dim1] * a[i__ + k * a_dim1];
00097 }
00098
00099 if (j >= l) {
00100 goto L47;
00101 }
00102
00103 j1 = j + 1;
00104 i__3 = l;
00105 for (k = j1; k <= i__3; ++k) {
00106 gl += a[k + j * a_dim1] * a[i__ + k * a_dim1];
00107 }
00108 L47:
00109 work[n + j] = gl / h__;
00110 f += gl * a[j + i__ * a_dim1];
00111 }
00112 hh = f / (h__ + h__);
00113 i__2 = l;
00114 for (j = 1; j <= i__2; ++j) {
00115 f = a[i__ + j * a_dim1];
00116 gl = work[n + j] - hh * f;
00117 work[n + j] = gl;
00118 i__3 = j;
00119 for (k = 1; k <= i__3; ++k) {
00120 a[j + k * a_dim1] = a[j + k * a_dim1] - f * work[n + k] - gl
00121 * a[i__ + k * a_dim1];
00122 }
00123 }
00124 work[i__] = h__;
00125 L65:
00126 --i__;
00127 }
00128 work[1] = (double)0.;
00129 work[n + 1] = (double)0.;
00130 i__1 = n;
00131 for (i__ = 1; i__ <= i__1; ++i__) {
00132 l = i__ - 1;
00133
00134 if (work[i__] == (double)0. || l == 0) {
00135 goto L100;
00136 }
00137
00138 i__3 = l;
00139 for (j = 1; j <= i__3; ++j) {
00140 gl = (double)0.;
00141 i__2 = l;
00142 for (k = 1; k <= i__2; ++k) {
00143 gl += a[i__ + k * a_dim1] * a[k + j * a_dim1];
00144 }
00145 i__2 = l;
00146 for (k = 1; k <= i__2; ++k) {
00147 a[k + j * a_dim1] -= gl * a[k + i__ * a_dim1];
00148 }
00149 }
00150 L100:
00151 work[i__] = a[i__ + i__ * a_dim1];
00152 a[i__ + i__ * a_dim1] = (double)1.;
00153
00154 if (l == 0) {
00155 goto L110;
00156 }
00157
00158 i__2 = l;
00159 for (j = 1; j <= i__2; ++j) {
00160 a[i__ + j * a_dim1] = (double)0.;
00161 a[j + i__ * a_dim1] = (double)0.;
00162 }
00163 L110:
00164 ;
00165 }
00166
00167
00168 n1 = n - 1;
00169 i__1 = n;
00170 for (i__ = 2; i__ <= i__1; ++i__) {
00171 i0 = n + i__ - 1;
00172 work[i0] = work[i0 + 1];
00173 }
00174 work[n + n] = (double)0.;
00175 b = (double)0.;
00176 f = (double)0.;
00177 i__1 = n;
00178 for (l = 1; l <= i__1; ++l) {
00179 j = 0;
00180 h__ = precis * ((r__1 = work[l], fabs(r__1)) + (r__2 = work[n + l],
00181 fabs(r__2)));
00182
00183 if (b < h__) {
00184 b = h__;
00185 }
00186
00187 i__2 = n;
00188 for (m1 = l; m1 <= i__2; ++m1) {
00189 m = m1;
00190
00191 if ((r__1 = work[n + m], fabs(r__1)) <= b) {
00192 goto L150;
00193 }
00194
00195 }
00196
00197 L150:
00198 if (m == l) {
00199 goto L205;
00200 }
00201
00202 L160:
00203 if (j == mits) {
00204 return ifault;
00205 }
00206
00207 ++j;
00208 pt = (work[l + 1] - work[l]) / (work[n + l] * (double)2.);
00209 r__ = sqrt(pt * pt + (double)1.);
00210 pr = pt + r__;
00211
00212 if (pt < (double)0.) {
00213 pr = pt - r__;
00214 }
00215
00216 h__ = work[l] - work[n + l] / pr;
00217 i__2 = n;
00218 for (i__ = l; i__ <= i__2; ++i__) {
00219 work[i__] -= h__;
00220 }
00221 f += h__;
00222 pt = work[m];
00223 c__ = (double)1.;
00224 s = (double)0.;
00225 m1 = m - 1;
00226 i__ = m;
00227 i__2 = m1;
00228 for (i1 = l; i1 <= i__2; ++i1) {
00229 j = i__;
00230 --i__;
00231 gl = c__ * work[n + i__];
00232 h__ = c__ * pt;
00233
00234 if (fabs(pt) >= (r__1 = work[n + i__], fabs(r__1))) {
00235 goto L180;
00236 }
00237
00238 c__ = pt / work[n + i__];
00239 r__ = sqrt(c__ * c__ + (double)1.);
00240 work[n + j] = s * work[n + i__] * r__;
00241 s = (double)1. / r__;
00242 c__ /= r__;
00243 goto L190;
00244 L180:
00245 c__ = work[n + i__] / pt;
00246 r__ = sqrt(c__ * c__ + (double)1.);
00247 work[n + j] = s * pt * r__;
00248 s = c__ / r__;
00249 c__ = (double)1. / r__;
00250 L190:
00251 pt = c__ * work[i__] - s * gl;
00252 work[j] = h__ + s * (c__ * gl + s * work[i__]);
00253 i__3 = n;
00254 for (k = 1; k <= i__3; ++k) {
00255 h__ = a[k + j * a_dim1];
00256 a[k + j * a_dim1] = s * a[k + i__ * a_dim1] + c__ * h__;
00257 a[k + i__ * a_dim1] = c__ * a[k + i__ * a_dim1] - s * h__;
00258 }
00259 }
00260 work[n + l] = s * pt;
00261 work[l] = c__ * pt;
00262
00263 if ((r__1 = work[n + l], fabs(r__1)) > b) {
00264 goto L160;
00265 }
00266
00267 L205:
00268 work[l] += f;
00269 }
00270 i__1 = n1;
00271 for (i__ = 1; i__ <= i__1; ++i__) {
00272 k = i__;
00273 pt = work[i__];
00274 i1 = i__ + 1;
00275 i__3 = n;
00276 for (j = i1; j <= i__3; ++j) {
00277
00278 if (work[j] >= pt) {
00279 goto L220;
00280 }
00281
00282 k = j;
00283 pt = work[j];
00284 L220:
00285 ;
00286 }
00287
00288 if (k == i__) {
00289 goto L240;
00290 }
00291
00292 work[k] = work[i__];
00293 work[i__] = pt;
00294 i__3 = n;
00295 for (j = 1; j <= i__3; ++j) {
00296 pt = a[j + i__ * a_dim1];
00297 a[j + i__ * a_dim1] = a[j + k * a_dim1];
00298 a[j + k * a_dim1] = pt;
00299 }
00300 L240:
00301 ;
00302 }
00303 ifault = 0;
00304
00305 return ifault;
00306 }
00307
00308
00309 }
00310
00311 }