|
|
1.1 root 1: #include "apl.h"
2:
3: ex_mdom()
4: {
5: register data *dp;
6: register a;
7: int i, j;
8: struct item *p, *q;
9:
10: p = fetch1();
11: if(p->rank != 2)
12: error("mdom C");
13: a = p->dim[0];
14: q = newdat(DA, 2, a*a);
15: q->dim[0] = a;
16: q->dim[1] = a;
17: push(q);
18: dp = q->datap;
19: for(i=0; i<a; i++)
20: for(j=0; j<a; j++) {
21: datum = zero;
22: if(i == j)
23: datum = one;
24: *dp++ = datum;
25: }
26: ex_ddom();
27: }
28:
29: ex_ddom()
30: {
31: struct item *p, *q;
32: register a, b;
33: register data *d1;
34: int m, n, o;
35: data *dmn, *dn1, *dn2, *dn3, *dm;
36: int *in;
37:
38: p = fetch2();
39: q = sp[-2];
40: if(p->type != DA || q->type != DA)
41: error("domino T");
42: if((p->rank != 1 && p->rank != 2) || q->rank != 2)
43: error("domino C");
44: m = q->dim[0];
45: n = q->dim[1];
46: if(m < n || m != p->dim[0])
47: error("domino R");
48: o = 1;
49: if(p->rank == 2)
50: o = p->dim[1];
51: a = alloc(n*(SINT + SDAT*m + SDAT*3) + SDAT*m);
52: if(a == -1)
53: error("domino M");
54: dmn = a;
55: dn1 = dmn + m*n;
56: dn2 = dn1 + n;
57: dn3 = dn2 + n;
58: dm = dn3 + n;
59: in = dm + m;
60: d1 = q->datap;
61: for(b=0; b<m; b++)
62: for(a=0; a<n; a++)
63: dmn[a*m+b] = *d1++;
64: a = lsq(dmn, dn1, dn2, dn3, dm, in, m, n, o, p->datap, q->datap);
65: afree(dmn);
66: if(a)
67: error("domino D");
68: sp--;
69: pop();
70: push(p);
71: p->dim[0] = n;
72: p->size = n*o;
73: }
74:
75: lsq(dmn, dn1, dn2, dn3, dm, in, m, n, p, d1, d2)
76: data *dmn, *dn1, *dn2, *dn3, *dm;
77: data *d1, *d2;
78: int *in;
79: {
80: register data *dp1, *dp2;
81: double f1, f2, f3, f4;
82: int i, j, k, l;
83:
84: dp1 = dmn;
85: dp2 = dn1;
86: for(j=0; j<n; j++) {
87: f1 = 0.;
88: for(i=0; i<m; i++) {
89: f2 = *dp1++;
90: f1 =+ f2*f2;
91: }
92: *dp2++ = f1;
93: in[j] = j;
94: }
95: for(k=0; k<n; k++) {
96: f1 = dn1[k];
97: l = k;
98: dp1 = dn1 + k+1;
99: for(j=k+1; j<n; j++)
100: if(f1 < *dp1++) {
101: f1 = dp1[-1];
102: l = j;
103: }
104: if(l != k) {
105: i = in[k];
106: in[k] = in[l];
107: in[l] = i;
108: dn1[l] = dn1[k];
109: dn1[k] = f1;
110: dp1 = dmn + k*m;
111: dp2 = dmn + l*m;
112: for(i=0; i<m; i++) {
113: f1 = *dp1;
114: *dp1++ = *dp2;
115: *dp2++ = f1;
116: }
117: }
118: f1 = 0.;
119: dp1 = dmn + k*m + k;
120: f3 = *dp1;
121: for(i=k; i<m; i++) {
122: f2 = *dp1++;
123: f1 =+ f2*f2;
124: }
125: if(f1 == 0.)
126: return(1);
127: f2 = sqrt(f1);
128: if(f3 >= 0.)
129: f2 = -f2;
130: dn2[k] = f2;
131: f1 = 1./(f1 - f3*f2);
132: dmn[k*m+k] = f3 - f2;
133: for(j=k+1; j<n; j++) {
134: f2 = 0.;
135: dp1 = dmn + k*m + k;
136: dp2 = dmn + j*m + k;
137: for(i=k; i<m; i++)
138: f2 =+ *dp1++ * *dp2++;
139: dn3[j] = f1*f2;
140: }
141: for(j=k+1; j<n; j++) {
142: dp1 = dmn + k*m + k;
143: dp2 = dmn + j*m + k;
144: f1 = dn3[j];
145: for(i=k; i<m; i++)
146: *dp2++ =- *dp1++ * f1;
147: f1 = dmn[j*m + k];
148: dn1[j] =- f1;
149: }
150: }
151: for(k=0; k<p; k++) {
152: dp1 = dm;
153: l = k;
154: for(i=0; i<m; i++) {
155: *dp1++ = d1[l];
156: l =+ p;
157: }
158: solve(m, n, dmn, dn2, in, dm, dn3);
159: l = k;
160: dp1 = dm;
161: for(i=0; i<m; i++) {
162: f1 = -d1[l];
163: l =+ p;
164: dp2 = dn3;
165: for(j=0; j<n; j++)
166: f1 =+ d2[i*n+j] * *dp2++;
167: *dp1++ = f1;
168: }
169: solve(m, n, dmn, dn2, in, dm, dn1);
170: f4 = 0.;
171: f3 = 0.;
172: dp1 = dn3;
173: dp2 = dn1;
174: for(i=0; i<n; i++) {
175: f1 = *dp1++;
176: f4 =+ f1*f1;
177: f1 = *dp2++;
178: f3 =+ f1*f1;
179: }
180: if(f3 > 0.0625*f4)
181: return(1);
182: loop:
183: if(intflg)
184: return(1);
185: dp1 = dn3;
186: dp2 = dn1;
187: for(i=0; i<n; i++)
188: *dp1++ =+ *dp2++;
189: if(f3 <= 4.81e-35*f4)
190: goto out;
191: l = k;
192: dp1 = dm;
193: for(i=0; i<m; i++) {
194: f1 = -d1[l];
195: l =+ p;
196: dp2 = dn3;
197: for(j=0; j<n; j++)
198: f1 =+ d2[i*n+j] * *dp2++;
199: *dp1++ = f1;
200: }
201: solve(m, n, dmn, dn2, in, dm, dn1);
202: f2 = f3;
203: f3 = 0.;
204: dp1 = dn1;
205: for(i=0; i<n; i++) {
206: f1 = *dp1++;
207: f3 =+ f1*f1;
208: }
209: if(f3 < 0.0625*f2)
210: goto loop;
211: out:
212: l = k;
213: dp1 = dn3;
214: for(i=0; i<n; i++) {
215: d1[l] = *dp1++;
216: l =+ p;
217: }
218: }
219: return(0);
220: }
221:
222: solve(m, n, dmn, dn2, in, dm, dn1)
223: data *dmn, *dn1, *dn2, *dm;
224: int *in;
225: {
226: register data *dp1, *dp2;
227: int i, j, k;
228: double f1, f2;
229:
230: for(j=0; j<n; j++) {
231: f1 = 0.;
232: dp1 = dmn + j*m + j;
233: dp2 = dm + j;
234: f2 = *dp1;
235: for(i=j; i<m; i++)
236: f1 =+ *dp1++ * *dp2++;
237: f1 =/ f2*dn2[j];
238: dp1 = dmn + j*m + j;
239: dp2 = dm + j;
240: for(i=j; i<m; i++)
241: *dp2++ =+ f1 * *dp1++;
242: }
243: dp1 = dm + n;
244: dp2 = dn2 + n;
245: dn1[in[n-1]] = *--dp1 / *--dp2;
246: for(i=n-2; i>=0; i--) {
247: f1 = -*--dp1;
248: k = (i+1)*m + i;
249: for(j=i+1; j<n; j++) {
250: f1 =+ dmn[k] * dn1[in[j]];
251: k =+ m;
252: }
253: dn1[in[i]] = -f1 / *--dp2;
254: }
255: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.