simple network in sw format
One interpretation of the BKO scheme is that it is a general notation to represent networks. Indeed, it is almost trivial to define networks in BKO. Here is a simple network, but extends easily:
Here is the BKO, and we have just decided to propagate the network using the "O" operator. You can choose anything really.
O |a1> => |a2>
O |a2> => |a3>
O |a3> => |a4>
O |a4> => |a5>
O |a5> => |a6>
O |a6> => |a7>
O |a7> => |a8>
O |a8> => |a9>
O |a9> => |a10>
O |a10> => |a1> + |b1>
O |b1> => |b2>
O |b2> => |b3>
O |b3> => |b4>
O |b4> => |b5>
O |b5> => |b6>
O |b6> => |b7>
O |b7> => |b1>
And being a network, we have a corresponding matrix representation:
sa: matrix[O]
[ a1 ] = [ 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ] [ a1 ]
[ a2 ] [ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] [ a2 ]
[ a3 ] [ 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] [ a3 ]
[ a4 ] [ 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] [ a4 ]
[ a5 ] [ 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 ] [ a5 ]
[ a6 ] [ 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ] [ a6 ]
[ a7 ] [ 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 ] [ a7 ]
[ a8 ] [ 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 ] [ a8 ]
[ a9 ] [ 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 ] [ a9 ]
[ a10 ] [ 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 ] [ a10 ]
[ b1 ] [ 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 ] [ b1 ]
[ b2 ] [ 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 ] [ b2 ]
[ b3 ] [ 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 ] [ b3 ]
[ b4 ] [ 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 ] [ b4 ]
[ b5 ] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 ] [ b5 ]
[ b6 ] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 ] [ b6 ]
[ b7 ] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 ] [ b7 ]
Now we have a network, we can propagate around it by applying the O operator repeatedly, which corresponds directly to the idea of applying the O matrix to a vector, where superpositions can be considered to be "sparse representations" of vectors -- we drop/ignore all elements that have coeff = 0. Let's start with 1 seed node, and step around. OK. I picked |a5> as the starting node:
sa: O |a5>
|a6>
sa: O O |a5>
|a7>
-- yeah. I got lazy, and dropped to the exponential notation (as you should!):
sa: O^3 |a5>
|a8>
sa: O^4 |a5>
|a9>
sa: O^5 |a5>
|a10>
sa: O^6 |a5>
|a1> + |b1>
sa: O^7 |a5>
|a2> + |b2>
sa: O^8 |a5>
|a3> + |b3>
And so on.
Now, let's pick more than one seed node, and add in some non {0,1} coeffs:
sa: O (|a2> + 7|a5> + 30 |a10> + 3.14|b5>)
|a3> + 7.000|a6> + 30.000|a1> + 30.000|b1> + 3.140|b6>
sa: O^2 (|a2> + 7|a5> + 30 |a10> + 3.14|b5>)
|a4> + 7.000|a7> + 30.000|a2> + 30.000|b2> + 3.140|b7>
sa: O^3 (|a2> + 7|a5> + 30 |a10> + 3.14|b5>)
|a5> + 7.000|a8> + 30.000|a3> + 30.000|b3> + 3.140|b1>
sa: O^4 (|a2> + 7|a5> + 30 |a10> + 3.14|b5>)
|a6> + 7.000|a9> + 30.000|a4> + 30.000|b4> + 3.140|b2>
sa: O^5 (|a2> + 7|a5> + 30 |a10> + 3.14|b5>)
|a7> + 7.000|a10> + 30.000|a5> + 30.000|b5> + 3.140|b3>
sa: O^6 (|a2> + 7|a5> + 30 |a10> + 3.14|b5>)
|a8> + 7.000|a1> + 7.000|b1> + 30.000|a6> + 30.000|b6> + 3.140|b4>
sa: O^7 (|a2> + 7|a5> + 30 |a10> + 3.14|b5>)
|a9> + 7.000|a2> + 7.000|b2> + 30.000|a7> + 30.000|b7> + 3.140|b5>
One advantage of the BKO notation is that it is trivial to define and redefine our network (much easier than manually entering elements into a matrix). How about we change a couple of rules:
sa: O |a4> => |a5> + 300 |b5>
sa: O |b2> => |b3> + 0.5 |a2>
Now, check out the new matrix:
sa: matrix[O]
[ a1 ] = [ 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ] [ a1 ]
[ a2 ] [ 1 0 0 0 0 0 0 0 0 0 0 0.5 0 0 0 0 0 ] [ a2 ]
[ a3 ] [ 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] [ a3 ]
[ a4 ] [ 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] [ a4 ]
[ a5 ] [ 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 ] [ a5 ]
[ a6 ] [ 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ] [ a6 ]
[ a7 ] [ 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 ] [ a7 ]
[ a8 ] [ 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 ] [ a8 ]
[ a9 ] [ 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 ] [ a9 ]
[ a10 ] [ 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 ] [ a10 ]
[ b1 ] [ 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 ] [ b1 ]
[ b2 ] [ 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 ] [ b2 ]
[ b3 ] [ 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 ] [ b3 ]
[ b4 ] [ 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 ] [ b4 ]
[ b5 ] [ 0 0 0 300 0 0 0 0 0 0 0 0 0 1 0 0 0 ] [ b5 ]
[ b6 ] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 ] [ b6 ]
[ b7 ] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 ] [ b7 ]
And our code can also spit out a matrix that has been applied a few times, eg 10 times:
sa: merged-matrix[O,O,O,O,O,O,O,O,O,O]
[ a1 ] = [ 1 0 0 0 0 0 0 0 0 0 0 0.5 0 0 0 0 0 ] [ a1 ]
[ a2 ] [ 0 1 0.5 0 0 0 0 0 0 150.5 75 0 0 0 0 0 0.5 ] [ a2 ]
[ a3 ] [ 150 0 1 0.5 0 0 0 0 0 0 0.5 75 0 0 0 0 0 ] [ a3 ]
[ a4 ] [ 0 150 0 1 0.5 0 0 0 0 0 0 0.5 0 0 0 0 0 ] [ a4 ]
[ a5 ] [ 0 0 150 0 1 0.5 0 0 0 0 0 0 0.5 0 0 0 0 ] [ a5 ]
[ a6 ] [ 0 0 0 150 0 1 0.5 0 0 0 0 0 0 0.5 0 0 0 ] [ a6 ]
[ a7 ] [ 0 0 0 0 0 0 1 0.5 0 0 0 0 0 0 0.5 0 0 ] [ a7 ]
[ a8 ] [ 0 0 0 0 0 0 0 1 0.5 0 0 0 0 0 0 0.5 0 ] [ a8 ]
[ a9 ] [ 0 0 0 0 0 0 0 0 1 0.5 0 0 0 0 0 0 0.5 ] [ a9 ]
[ a10 ] [ 0 0 0 0 0 0 0 0 0 1 0.5 0 0 0 0 0 0 ] [ a10 ]
[ b1 ] [ 1 0 0 0 0 0 0 301 150 0 0 0.5 0 0 1 150 0 ] [ b1 ]
[ b2 ] [ 0 1 0 0 0 0 0 0 301 150 0 0 0 0 0 1 150 ] [ b2 ]
[ b3 ] [ 0 0 1 0 0 0 0 0 0 301 150 0 0 0 0 0 1 ] [ b3 ]
[ b4 ] [ 300 0 0 1 0 0 0 0 0 0 1 150 0 0 0 0 0 ] [ b4 ]
[ b5 ] [ 0 300 45000 0 301 150 0 0 0 0 0 1 150 0 0 0 0 ] [ b5 ]
[ b6 ] [ 0 0 300 45000 0 301 150 0 0 0 0 0 1 150 0 0 0 ] [ b6 ]
[ b7 ] [ 0 0 0 300 0 0 301 150 0 0 0 0 0 1 150 0 0 ] [ b7 ]
Now, it would be nice if we could just do: merged-matrix[O^10] or something, but my code can't currently do that. Shouldn't be too hard to add if I get the inclination.
That's it for this post. I think some more matrices in the next post or two.
Home
previous: diversion the tidy language underneath
next: matrices in sw format
updated: 19/12/2016
by Garry Morrison
email: garry -at- semantic-db.org