DelayedAtomic.jl 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import DEVS2Agents: time_advance, internal_transition!, external_transition!, confluent_transition!, output!, setup_ports!, format_state, format_message
  2. @enum State DA_Passive=1 DA_Active=2
  3. struct A2A <: DEVSMessage
  4. activate::Int
  5. end
  6. function julia_stones(delay::Float64)
  7. val = 0.0
  8. for i in 1:Int(round(delay))
  9. val += sin(i)
  10. end
  11. return val
  12. end
  13. @agent struct DelayedAtomic(AtomicDEVS)
  14. state::State = DA_Passive
  15. int_delay::Float64 = 0.0
  16. ext_delay::Float64 = 0.0
  17. prep_time::Float64 = 0.0
  18. has_out_port::Bool = false
  19. stats::Bool = false
  20. int_count::Int = 0
  21. ext_count::Int = 0
  22. end
  23. format_state(agent::DelayedAtomic) = "State.$(agent.state)"
  24. format_message(msg::A2A) = "$(msg.activate)"
  25. function setup_ports!(agent::DelayedAtomic)
  26. add_in_port!(agent, :i_in)
  27. if agent.has_out_port
  28. add_out_port!(agent, :o_out)
  29. end
  30. end
  31. function time_advance(agent::DelayedAtomic, model)
  32. return agent.state == DA_Active ? agent.prep_time : Inf
  33. end
  34. function internal_transition!(agent::DelayedAtomic, model)
  35. agent.stats && (agent.int_count += 1)
  36. agent.int_delay > 0.0 && julia_stones(agent.int_delay)
  37. agent.state = DA_Passive
  38. end
  39. function external_transition!(agent::DelayedAtomic, model, e, bag)
  40. agent.stats && (agent.ext_count += 1)
  41. agent.ext_delay > 0.0 && julia_stones(agent.ext_delay)
  42. agent.state = DA_Active
  43. end
  44. function confluent_transition!(agent::DelayedAtomic, model, bag)
  45. internal_transition!(agent, model)
  46. external_transition!(agent, model, 0.0, bag)
  47. end
  48. function output!(agent::DelayedAtomic, model)
  49. if agent.has_out_port
  50. return (
  51. (
  52. :o_out, (A2A(0), )
  53. ),
  54. )
  55. end
  56. return nothing
  57. end