```------------------------------------------
------------------------------------------
----- A System Matrix Implementation -----
----- using Sparse Matrix Methods,   -----
----- and Energy Flow Processing     -----
-----                                -----
----- By John Ringland               -----
----- 2004/11/21                     -----
------------------------------------------
------------------------------------------

-- this file uses sparse matrix energy flow methods
-- to implement an ergodic pure metric sysWrapped SMN framework

--with trace
include ergodicSysMSMN.e

---------------------------------
---------------------------------
-----  Test Model of a Two  -----
-----  Tiered NAND system   -----
---------------------------------
---------------------------------

sequence st, sm, sv, model, cUpdate, result
object is

function NAND(sequence in)
-- in is a pair of cData bools; either zero or one
return not (in[1]*in[2])
end function

integer NAND_id
NAND_id = routine_id("NAND")

-- input selector
is = {1,1}

st = {NAND_id,NAND_id,NAND_id}

-- constructing the Metric System Matrix element by element
sm = sparse_SM(7,7)
sm = set_SM(sm, {1,2}, is)
sm = set_SM(sm, {1,3}, is)
sm = set_SM(sm, {2,4}, is)
sm = set_SM(sm, {2,5}, is)
sm = set_SM(sm, {3,6}, is)
sm = set_SM(sm, {3,7}, is)

-- constructing the final State Vector
sv = {0,0,0,1,1,1,0} -- a=1, b=1, c=1, d=0

-- flagging the initial inputs for processing
cUpdate = {4,5,6,7}

-- combining all of the above into a single system model
model = {st,sm,sv,cUpdate}

puts(1,"\n\nTwo Tiered NAND System\n\n")
puts(1,"initial model\n")
? model

puts(1,"first iteration\n")
result = step_Model(model, 1)
puts(1,"State Vector:    ")
? result[model_][SV_]
puts(1,"cUpdate:         ")
? result[model_][CU_]
puts(1,"\nsecond iteration\n")
result = step_Model(result[model_], 1)
puts(1,"State Vector:    ")
? result[model_][SV_]
puts(1,"cUpdate:         ")
? result[model_][CU_]
puts(1,"\nthird iteration\n")
result = step_Model(result[model_], 1)
puts(1,"State Vector:    ")
? result[model_][SV_]
puts(1,"cUpdate:         ")
? result[model_][CU_]
puts(1,"\nall iterations at once\n")
result = step_Model(model, 100)
puts(1,"State Vector:    ")
? result[model_][SV_]
puts(1,"cUpdate:         ")
? result[model_][CU_]
puts(1,"\nthen change b=0\n")
result[model_][SV_][5] = 0
result[model_][CU_] = {5}
puts(1,"State Vector:    ")
? result[model_][SV_]
puts(1,"cUpdate:         ")
? result[model_][CU_]
puts(1,"\nfirst iteration\n")
result = step_Model(result[model_], 1)
puts(1,"State Vector:    ")
? result[model_][SV_]
puts(1,"cUpdate:         ")
? result[model_][CU_]
puts(1,"\nsecond iteration\n")
result = step_Model(result[model_], 1)
puts(1,"State Vector:    ")
? result[model_][SV_]
puts(1,"cUpdate:         ")
? result[model_][CU_]
puts(1,"\nthird iteration\n")
result = step_Model(result[model_], 1)
puts(1,"State Vector:    ")
? result[model_][SV_]
puts(1,"cUpdate:         ")
? result[model_][CU_]

constant ITERATIONS = 10000

t0 = time()
for i = 1 to ITERATIONS do
-- time an empty loop
end for