1 |
|
2 |
|
3 |
|
4 |
|
5 | Eval_outer = ->
|
6 | p1 = cdr(p1)
|
7 | push(car(p1))
|
8 | Eval()
|
9 | p1 = cdr(p1)
|
10 | while (iscons(p1))
|
11 | push(car(p1))
|
12 | Eval()
|
13 | outer()
|
14 | p1 = cdr(p1)
|
15 |
|
16 | outer = ->
|
17 | save()
|
18 | p2 = pop()
|
19 | p1 = pop()
|
20 | if (istensor(p1) && istensor(p2))
|
21 | yyouter()
|
22 | else
|
23 | push(p1)
|
24 | push(p2)
|
25 | if (istensor(p1))
|
26 | tensor_times_scalar()
|
27 | else if (istensor(p2))
|
28 | scalar_times_tensor()
|
29 | else
|
30 | multiply()
|
31 | restore()
|
32 |
|
33 | yyouter = ->
|
34 | i = 0
|
35 | j = 0
|
36 | k = 0
|
37 | ndim = 0
|
38 | nelem = 0
|
39 |
|
40 | ndim = p1.tensor.ndim + p2.tensor.ndim
|
41 |
|
42 | if (ndim > MAXDIM)
|
43 | stop("outer: rank of result exceeds maximum")
|
44 |
|
45 | nelem = p1.tensor.nelem * p2.tensor.nelem
|
46 |
|
47 | p3 = alloc_tensor(nelem)
|
48 |
|
49 | p3.tensor.ndim = ndim
|
50 |
|
51 | for i in [0...p1.tensor.ndim]
|
52 | p3.tensor.dim[i] = p1.tensor.dim[i]
|
53 |
|
54 | j = i
|
55 |
|
56 | for i in [0...p2.tensor.ndim]
|
57 | p3.tensor.dim[j + i] = p2.tensor.dim[i]
|
58 |
|
59 | k = 0
|
60 |
|
61 | for i in [0...p1.tensor.nelem]
|
62 | for j in [0...p2.tensor.nelem]
|
63 | push(p1.tensor.elem[i])
|
64 | push(p2.tensor.elem[j])
|
65 | multiply()
|
66 | p3.tensor.elem[k++] = pop()
|
67 |
|
68 | push(p3)
|
69 |
|
70 |
|