|
|
1.1 root 1: #include "apl.h"
2:
3: ex_iprod()
4: {
5: register i, j;
6: struct item *p, *q, *r;
7: int param[10], ipr1();
8:
9: param[0] = exop[*pcp++];
10: param[1] = exop[*pcp++];
11: p = fetch2();
12: q = sp[-2];
13: if(p->type != DA || q->type != DA)
14: error("iprod T");
15: bidx(p);
16: idx.rank--;
17: param[2] = idx.dim[idx.rank];
18: if(param[2] != q->dim[0])
19: error("inner prod C");
20: param[3] = q->size/param[2];
21: for(i=1; i<q->rank; i++)
22: idx.dim[idx.rank++] = q->dim[i];
23: r = newdat(DA, idx.rank, size());
24: copy(IN, idx.dim, r->dim, idx.rank);
25: param[4] = 0;
26: param[5] = 0;
27: param[6] = p->datap;
28: param[7] = q->datap;
29: param[8] = r->datap;
30: param[9] = p->size;
31: forloop(ipr1, param);
32: pop();
33: pop();
34: push(r);
35: }
36:
37: ipr1(param)
38: int param[];
39: {
40: register i, dk;
41: int lk, a, b;
42: data *dp1, *dp2, *dp3;
43: data (*f1)(), (*f2)(), d;
44:
45: f1 = param[0];
46: f2 = param[1];
47: dk = param[2];
48: lk = param[3];
49: a = param[4];
50: b = param[5];
51: dp1 = param[6];
52: dp2 = param[7];
53: dp3 = param[8];
54: a =+ dk;
55: b =+ (dk * lk);
56: for(i=0; i<dk; i++) {
57: a--;
58: b =- lk;
59: d = (*f2)(dp1[a], dp2[b]);
60: if(i == 0)
61: datum = d; else
62: datum = (*f1)(d, datum);
63: }
64: *dp3++ = datum;
65: param[8] = dp3;
66: param[5]++;
67: if(param[5] >= lk) {
68: param[5] = 0;
69: param[4] =+ dk;
70: if(param[4] >= param[9])
71: param[4] = 0;
72: }
73: }
74:
75: ex_oprod()
76: {
77: register i, j;
78: register data *dp;
79: struct item *p, *q, *r;
80: data *dp1, *dp2;
81: data (*f)();
82:
83: f = exop[*pcp++];
84: p = fetch2();
85: q = sp[-2];
86: if(p->type != DA || q->type != DA)
87: error("oprod T");
88: bidx(p);
89: for(i=0; i<q->rank; i++)
90: idx.dim[idx.rank++] = q->dim[i];
91: r = newdat(DA, idx.rank, size());
92: copy(IN, idx.dim, r->dim, idx.rank);
93: dp = r->datap;
94: dp1 = p->datap;
95: for(i=0; i<p->size; i++) {
96: datum = *dp1++;
97: dp2 = q->datap;
98: for(j=0; j<q->size; j++)
99: *dp++ = (*f)(datum, *dp2++);
100: }
101: pop();
102: pop();
103: push(r);
104: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.