| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- import DEVS2Agents: time_advance, internal_transition!, external_transition!, confluent_transition!, output!, setup_ports!, format_state, format_message
- @enum State DA_Passive=1 DA_Active=2
- struct A2A <: DEVSMessage
- activate::Int
- end
- function julia_stones(delay::Float64)
- val = 0.0
- for i in 1:Int(round(delay))
- val += sin(i)
- end
- return val
- end
- @agent struct DelayedAtomic(AtomicDEVS)
- state::State = DA_Passive
- int_delay::Float64 = 0.0
- ext_delay::Float64 = 0.0
- prep_time::Float64 = 0.0
- has_out_port::Bool = false
- stats::Bool = false
- int_count::Int = 0
- ext_count::Int = 0
- end
- format_state(agent::DelayedAtomic) = "State.$(agent.state)"
- format_message(msg::A2A) = "$(msg.activate)"
- function setup_ports!(agent::DelayedAtomic)
- add_in_port!(agent, :i_in)
- if agent.has_out_port
- add_out_port!(agent, :o_out)
- end
- end
- function time_advance(agent::DelayedAtomic, model)
- return agent.state == DA_Active ? agent.prep_time : Inf
- end
- function internal_transition!(agent::DelayedAtomic, model)
- agent.stats && (agent.int_count += 1)
- agent.int_delay > 0.0 && julia_stones(agent.int_delay)
- agent.state = DA_Passive
- end
- function external_transition!(agent::DelayedAtomic, model, e, bag)
- agent.stats && (agent.ext_count += 1)
- agent.ext_delay > 0.0 && julia_stones(agent.ext_delay)
- agent.state = DA_Active
- end
- function confluent_transition!(agent::DelayedAtomic, model, bag)
- internal_transition!(agent, model)
- external_transition!(agent, model, 0.0, bag)
- end
- function output!(agent::DelayedAtomic, model)
- if agent.has_out_port
- return (
- (
- :o_out, (A2A(0), )
- ),
- )
- end
- return nothing
- end
|