------------------------------------------------------------------------------- Mohamed G. Gouda CS 356 Summer 2007 Homework 3 Solution ------------------------------------------------------------------------------- 1. (4 Points): process p[0] inp N : set {1, n-1} up : array [N] of boolean var left : 0..n-1, right : 0..n-1, j : 0..n-1 par g : N begin up[1] -> send st(0) to p[1] [] up[n-1] -> send st(0) to p[n-1] [] rcv st(j) from p[g] -> if g = 1 -> right := j [] g = n-1 -> left := j fi [] rcv error from p[g] -> skip end process p[i : 1..n-1] inp N : set {i -n 1, i +n 1}, up : array [N] of boolean var left : 0..n-1, right : 0..n-1, j : 0..n-1 par g : N begin ~up[i -n 1] -> left := i; if up[i +n 1] -> send st(i) to p[i +n 1] [] ~up[i +n 1] -> skip fi [] ~up[i +n 1] -> right := i; if up[i -n 1] -> send st(i) to p[i +n 1] [] ~up[i -n 1] -> skip fi [] rcv st(j) from p[g] -> if g = i -n 1 ^ up[i +n 1] -> left := j; send st(j) to p[i +n 1] [] g = i -n 1 ^ ~up[i +n 1] -> left := j [] g = i +n 1 ^ up[i -n 1] -> right := j; send st(j) to p[i -n 1] [] g = i +n 1 ^ ~up[i -n 1] -> right := j fi [] rcv error from p[g] -> skip end ------------------------------------------------------------------------------- 2. (3 Points): process p[i : 0..n-1] const lmax inp N : set {g | p[g] is a neighbor of p[i]}, load : 0..lmax var ld : array [N] of 0..lmax b : 0..1 d : 0..lmax par g : N begin rcv chk(b,d) from p[g] -> if b = 0 -> ld[g] := lmax [] b = 1 -> ld[g] := d fi; send chk(1, load) to p[g] [] rcv error from p[g] -> skip [] timeout (#ch.p[i].p[g] + #ch.p[g].p[i] = 0) -> ld[g] := lmax; if i <= g -> send chk(0,load) to p[g] [] i > g -> skip fi end ------------------------------------------------------------------------------- 3. (3 Points): process p[i : 0..n-1] inp N : set {j | p[j] is a neighbor of p[i]}, up : array [N] of boolean var net : array [0..n-1, 0..n-1] of boolean, vp : array [0..n-1] of boolean, f, h : N m : 0..n k : 0..n-1 par g : N begin true -> m := 0; do m < n -> if (m in N ^ up[m]) -> net[m, i], net[i, m], vp[m] := true, true, true [] ~(m in N ^ up[m]) -> net[m, i], net[i, m], vp[m] := false, false, false fi; m := m + 1 od h: = NEXT(N, f); do h != f -> if up[h] -> send st(i,vp) to p[h] [] ~up[h] -> skip fi; h := NEXT(N, h) od; if up[f] -> send st(i,vp) to p[f] [] ~up[f] -> skip fi [] rcv st(k,vp) from p[g] -> m := 0; do m < n -> net[m, k], net[k, m], m := vp[m], vp[m], m+1 od; h := NEXT(N, g); do h != g -> if up[h] -> send st(k, vp) to p[h] [] ~up[h] -> skip fi; h: = NEXT(N, h) od end -------------------------------------------------------------------------------