UNPKG

1.01 kBtext/coffeescriptView Raw
1# Outer product of tensors
2
3
4
5Eval_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
16outer = ->
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
33yyouter = ->
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