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