Annotation of 43BSD/contrib/apl/src/a8.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.