Actor | Sent | Received | Send Rate | Receive Rate | Activity |
---|---|---|---|---|---|
alice | 2275 | 2191 | 758.33 msg/s | 730.33 msg/s | 4466 total |
bob | 2345 | 2273 | 781.67 msg/s | 757.67 msg/s | 4618 total |
charlie | 2417 | 2357 | 805.67 msg/s | 785.67 msg/s | 4774 total |
diana | 2553 | 2505 | 851.0 msg/s | 835.0 msg/s | 5058 total |
eve | 2550 | 2514 | 850.0 msg/s | 838.0 msg/s | 5064 total |
frank | 2677 | 2641 | 892.33 msg/s | 880.33 msg/s | 5318 total |
grace | 2705 | 2669 | 901.67 msg/s | 889.67 msg/s | 5374 total |
This is the Elixir code that defines the actor simulation model:
# Create 7 actors that randomly send :hi messages to each other
# Using fixed random seed for reproducible results
# Set random seed for reproducibility
:rand.seed(:exs1024, {12_345, 67_890, 11_111})
# Create list of all actor names for random selection
all_actors = [:alice, :bob, :charlie, :diana, :eve, :frank, :grace]
# Function to randomly select a target (excluding self)
random_target = fn sender, targets ->
available_targets = Enum.reject(targets, fn target -> target == sender end)
if length(available_targets) > 0 do
Enum.random(available_targets)
else
nil
end
end
# Handler that sends random :hi messages
random_hi_handler = fn msg, state ->
case msg do
:hi ->
# Randomly choose target and send :hi back
target = random_target.(state.name, state.all_actors)
if target do
{:send, [{target, :hi}], state}
else
{:ok, state}
end
_ ->
{:ok, state}
end
end
simulation =
ActorSimulation.new(trace: true) # Enable tracing for sequence diagram
|> ActorSimulation.add_actor(:alice,
send_pattern: {:periodic, 200, :hi},
targets: [:bob, :charlie, :diana, :eve, :frank, :grace],
on_receive: random_hi_handler,
initial_state: %{name: :alice, all_actors: all_actors}
)
|> ActorSimulation.add_actor(:bob,
targets: [:alice, :charlie, :diana, :eve, :frank, :grace],
on_receive: random_hi_handler,
initial_state: %{name: :bob, all_actors: all_actors}
)
|> ActorSimulation.add_actor(:charlie,
targets: [:alice, :bob, :diana, :eve, :frank, :grace],
on_receive: random_hi_handler,
initial_state: %{name: :charlie, all_actors: all_actors}
)
|> ActorSimulation.add_actor(:diana,
targets: [:alice, :bob, :charlie, :eve, :frank, :grace],
on_receive: random_hi_handler,
initial_state: %{name: :diana, all_actors: all_actors}
)
|> ActorSimulation.add_actor(:eve,
targets: [:alice, :bob, :charlie, :diana, :frank, :grace],
on_receive: random_hi_handler,
initial_state: %{name: :eve, all_actors: all_actors}
)
|> ActorSimulation.add_actor(:frank,
targets: [:alice, :bob, :charlie, :diana, :eve, :grace],
on_receive: random_hi_handler,
initial_state: %{name: :frank, all_actors: all_actors}
)
|> ActorSimulation.add_actor(:grace,
targets: [:alice, :bob, :charlie, :diana, :eve, :frank],
on_receive: random_hi_handler,
initial_state: %{name: :grace, all_actors: all_actors}
)
|> ActorSimulation.run(duration: 3000) # Run for 3 seconds to get many interactions
# Generate sequence diagram
html = ActorSimulation.generate_sequence_diagram(simulation,
title: "Random Hi Messages - 7 Actors",
model_source: model_source
)