ack/lang/occam/test/matmul.ocm

99 lines
1.8 KiB
Plaintext
Raw Normal View History

1987-02-25 17:14:10 +00:00
#include "dec.ocm"
proc prompt(value str[])=
seq i=[1 for str[byte 0]]
output ! str[byte i]
:
def N=20 :
var n:
var A[N*N], x[N], k[N], y[N] :
proc initialise=
var c:
seq
prompt("n?*n")
c:='*s'
decin(input, n, c)
prompt("A?*n")
seq i= [0 for n]
seq j= [0 for n]
decin(input, A[(i*n)+j], c)
prompt("x?*n")
seq i= [0 for n]
decin(input, x[i], c)
prompt("k?*n")
seq i= [0 for n]
decin(input, k[i], c) :
proc produce.xj(value j, chan south) =
-- north row: source of x values
while true
south ! x[j] :
proc consume.yi(value i, chan east) =
-- west column: read y values
east ? y[i] :
proc offset(value ki, chan west) =
-- east column: source of k offsets
while true
west ! ki :
proc multiplier(value aij, chan north, south, west, east) =
-- middle: responsible for a values
var xj, aij.times.xj, yi :
seq
north ? xj
while true
seq
par
south ! xj
aij.times.xj:= aij*xj
east ? yi
par
west ! yi+aij.times.xj
north ? xj :
proc sink(chan north) =
-- south row: sink for unused outputs
while true
north ? any :
seq
initialise
chan north.south[(N+1)*N], east.west[N*(N+1)] :
par
par j= [0 for n] -- producer of co-ordinates x[j]
produce.xj(j, north.south[j])
par -- the matrix multiplier
par i= [0 for n]
offset(k[i], east.west[(n*n)+i])
par i= [0 for n]
par j= [0 for n]
multiplier(A[(n*i)+j],
north.south[(n*i)+j],
north.south[(n*(i+1))+j],
east.west[i+(n*j)],
east.west[i+(n*(j+1))])
par j= [0 for n]
sink(north.south[(n*n)+j])
seq
par i= [0 for n]-- consumer of transformed co-ordinates
consume.yi(i, east.west[i])
seq i= [0 for n]
seq
output ! 'y'; '['
decout(output, i, 0)
output ! ']'; '='
decout(output, y[i], 5)
output ! '*n'
exit(0)