Skip to content
Snippets Groups Projects
Select Git revision
  • e9766100a85b44c85abdb88441473d8bc74af87b
  • dev default protected
  • main protected
  • feature/ros-java-integration
4 results

sendDefinition.mustache

Blame
  • 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