Select Git revision
cgv_connector.proto
CPNCalc.jl 5.60 KiB
module CPNCalc
export runPN
using ..context
using ..ContextualPNs
function nonNeg(x)
sign.(sign.(x) .+ 1)
end
function pos(x)
sign.(sign.(x) .- 1) .+ 1
end
function neg(x)
1 .- nonNeg(x)
end
function matrixify(v, N)
transpose(transpose(v) .* ones(N))
end
function runPN(W_i::AbstractArray, W_o::AbstractArray, W_inhibitor::AbstractArray, W_test::AbstractArray, t::AbstractArray, P::AbstractArray)
while true
T = matrixify(t, size(W_i)[2])
f_normal = nonNeg(findmin(T .- W_o, dims=1)[1])
f_inhibitor = neg(findmax(T .- W_inhibitor, dims=1)[1])
f_test = nonNeg(findmin(T .- W_test, dims=1)[1])
f = f_normal .* f_inhibitor .* f_test
c = neg(t .- W_o * transpose(f))
while sum(c) > 0
m = findmax(P, dims=1)[1]
f = f .- pos(findmax(P .- matrixify(m, size(W_i)[2]) .+ matrixify(c, size(W_i)[2]), dims=2)[1])
c = neg(t .- W_o * transpose(f))
end
if sum((W_i .- W_o) * transpose(f)) == 0
break
end
t = t .+ (W_i .- W_o) * transpose(f)
println("Token Vector: ", t)
end
end
function runPN(pn::CompiledPetriNet, activeContexts::AbstractVector=[])
if activeContexts == []
a = zeros(size(pn.ContextMatrix)[2])
elseif activeContexts isa AbstractVector{Int}
if size(activeContexts)[2] != size(pn.ContextMatrix)[2]
print("ERROR")
end
elseif activeContexts isa AbstractVector{String}
a = zeros(size(pn.ContextMatrix)[2])
for context in activeContexts
a[pn.ContextMap[context]] = 1
end
elseif activeContexts isa AbstractVector{<:Context}
a = zeros(size(pn.ContextMatrix)[2])
for context in activeContexts
a[pn.ContextMap[context]] = 1
end
end
FL = Vector{Context}(undef, size(pn.ContextMatrix)[2])
for context in keys(pn.ContextMap)
FL[pn.ContextMap[context]] = context
end
while true
T = matrixify(pn.tokenVector, size(pn.WeightMatrix_in)[2])
f_normal = nonNeg(findmin(T .- pn.WeightMatrix_out, dims=1)[1])
f_inhibitor = neg(findmax(pn.WeightMatrix_inhibitor .* (T .- pn.WeightMatrix_inhibitor), dims=1)[1])
f_test = nonNeg(findmin(T .- pn.WeightMatrix_test, dims=1)[1])
f_context = nonNeg(transpose(pn.ContextMatrix * a - pn.ContextMatrix * ones(size(pn.ContextMatrix)[2])))
f = f_normal .* f_inhibitor .* f_test .* f_context
c = neg(pn.tokenVector .- pn.WeightMatrix_out * transpose(f))
while sum(c) > 0
m = findmax(pn.PrioritiesMatrix, dims=2)[1]
f = f .- pos(findmax(pn.PrioritiesMatrix .- matrixify(m, size(pn.WeightMatrix_in)[2]) .+ matrixify(c, size(pn.WeightMatrix_in)[2]), dims=1)[1])
c = neg(pn.tokenVector .- pn.WeightMatrix_out * transpose(f))
end
if sum(f) == 0
println("Petri net is dead.")
break
end
u = sign.(pn.UpdateMatrix * transpose(f))
a = pos(a + u)
for context in FL[Bool.(dropdims(a, dims=2))]
activateContext(context)
end
for context in FL[Bool.(dropdims((a .- 1).^2, dims=2))]
deactivateContext(context)
end
pn.tokenVector = vec(pn.tokenVector .+ (pn.WeightMatrix_in .- pn.WeightMatrix_out) * transpose(f))
println("Token Vector: ", pn.tokenVector, " active Contexts: ", FL[Bool.(dropdims(a, dims=2))])
end
end
"""
function runPN(pn::CompiledPetriNet, activeContexts::AbstractVector=[])
W_i = pn.WeightMatrix_in
W_o = pn.WeightMatrix_out
W_inhibitor = pn.WeightMatrix_inhibitor
W_test = pn.WeightMatrix_test
P = pn.PrioritiesMatrix
t = pn.tokenVector
F = pn.ContextMatrix
U = pn.UpdateMatrix
CM = pn.ContextMap
if activeContexts == []
a = zeros(size(F)[2])
elseif activeContexts isa AbstractVector{Int}
if size(activeContexts)[2] != size(F)[2]
print("ERROR")
end
elseif activeContexts isa AbstractVector{String}
a = zeros(size(F)[2])
for context in activeContexts
a[CM[context]] = 1
end
elseif activeContexts isa AbstractVector{<:Context}
a = zeros(size(F)[2])
for context in activeContexts
a[CM[context]] = 1
end
end
FL = Vector{Context}(undef, size(F)[2])
for context in keys(CM)
FL[CM[context]] = context
end
while true
T = matrixify(t, size(W_i)[2])
f_normal = nonNeg(findmin(T .- W_o, dims=1)[1])
f_inhibitor = neg(findmax(W_inhibitor .* (T .- W_inhibitor), dims=1)[1])
f_test = nonNeg(findmin(T .- W_test, dims=1)[1])
f_context = nonNeg(transpose(F * a - F * ones(size(F)[2])))
f = f_normal .* f_inhibitor .* f_test .* f_context
c = neg(t .- W_o * transpose(f))
while sum(c) > 0
m = findmax(P, dims=2)[1]
f = f .- pos(findmax(P .- matrixify(m, size(W_i)[2]) .+ matrixify(c, size(W_i)[2]), dims=1)[1])
c = neg(t .- W_o * transpose(f))
end
if sum(f) == 0
println("Petri net is dead.")
break
end
u = sign.(U * transpose(f))
a = pos(a + u)
for context in FL[Bool.(dropdims(a, dims=2))]
activateContext(context)
end
for context in FL[Bool.(dropdims((a .- 1).^2, dims=2))]
deactivateContext(context)
end
t = t .+ (W_i .- W_o) * transpose(f)
println("Token Vector: ", t, " active Contexts: ", FL[Bool.(dropdims(a, dims=2))])
end
end
"""
end