1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- #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)
|