DECLARE SUB graph ()
DECLARE SUB plo (k!)
CLS : RESTORE
PRINT "Hopfield model"
CONST m = 5 ' Edge side
CONST n = 2 ' Number of pictures
CONST ipl = 1 ' Plotting switch
DIM SHARED a(m * m, n) ' Pictures
DIM SHARED t(m * m, m * m) ' Synapses
RANDOMIZE 2
IF ipl = 1 THEN CALL graph
PRINT "Read images"
FOR k = n TO 0 STEP -1
st: LOCATE 3 + 7 * k
READ p$: IF ipl = 0 THEN PRINT p$
FOR i = 1 TO m * m
READ a(i, k)
NEXT i
plo (k)
IF k <> 0 THEN
LOCATE 2, 1: PRINT "Memorise "
FOR j = 1 TO m * m
FOR i = 1 TO m * m
IF i <> j THEN
y = 1 + (2 * a(i, k) - 1) * (2 * a(j, k) - 1)
t(i, j) = t(i, j) + y / 2
END IF
NEXT i
NEXT j
END IF
IF k > 0 THEN INPUT i$
NEXT k
LOCATE 1, 1: PRINT p$; " "
LOCATE 2, 1: PRINT "Recall "
INPUT i$
FOR it = 1 TO m * m * 5
k = 0
s = 0 ' Threshold sum
j = INT(m * m * RND + 1)
FOR i = 1 TO m * m
IF i <> j THEN
IF a(i, 0) = 1 THEN s = s + t(i, j): ELSE s = s + n - t(i, j)
END IF
NEXT i
IF s < n * (m * m - 1) / 2 THEN a(j, 0) = 0: ELSE a(j, 0) = 1
LOCATE 4, 1
plo (k)
mt = it / (m * m)
IF INT(mt) = mt THEN LOCATE 5, 1: PRINT "Iteration "; mt: INPUT i$
NEXT it
INPUT i$
GOTO st
DATA " man"
DATA 0,0,1,0,0
DATA 1,1,1,1,1
DATA 0,0,1,0,0
DATA 0,1,0,1,0
DATA 1,0,0,0,1
DATA " dog"
DATA 0,0,0,0,0
DATA 0,0,0,0,0
DATA 0,1,0,0,1
DATA 1,1,1,1,1
DATA 0,1,0,1,0
DATA " seed1"
DATA 0,0,1,0,0
DATA 0,0,1,0,0
DATA 0,0,0,0,0
DATA 0,0,0,0,0
DATA 0,0,0,0,0
DATA " seed2"
DATA 0,0,0,0,0
DATA 0,0,0,0,0
DATA 0,0,0,0,0
DATA 1,1,0,0,0
DATA 0,0,0,0,0
DATA " noise"
DATA 0,0,0,0,0
DATA 0,1,0,1,1
DATA 0,1,1,0,0
DATA 0,0,1,1,0
DATA 1,0,0,0,1
SUB graph
SCREEN 8
VIEW (0, 0)-(499, 199)
WINDOW (0, 0)-(12, 12)
END SUB
SUB mat
LOCATE 1, 20
FOR i = 1 TO m * m
LOCATE 1 + i, 20
FOR j = 1 TO m * m
PRINT USING "#"; t(i, j);
NEXT j
PRINT
NEXT i
END SUB
SUB plo (k)
IF ipl = 0 THEN
FOR i = 1 TO m * m
PRINT a(i, k);
IF i / m = INT(i / m) THEN PRINT
NEXT i
END IF
IF ipl = 1 THEN
iy = m
IF k = 0 THEN sx = 0: sy = 0
IF k = 1 THEN sx = 7: sy = 0
IF k = 2 THEN sx = 7: sy = 6
LINE (sx, sy)-(m + sx, m + sy), 14, B
FOR i = 1 TO m * m
ix = ix + 1
IF a(i, k) > 0 THEN
LINE (ix - 1 + sx, iy - 1 + sy)-(ix + sx, iy + sy), 14, B
PAINT (ix - .5 + sx, iy - .5 + sy), 15, 14
ELSE
PAINT (ix - .5 + sx, iy - .5 + sy), 0, 14
END IF
IF i / m = INT(i / m) THEN ix = 0: iy = iy - 1
NEXT i
END IF
END SUB