| Actor | Sent | Received | Send Rate | Receive Rate | Activity |
|---|---|---|---|---|---|
| alice | 6469580 | 6469496 | 2156526.67 msg/s | 2156498.67 msg/s | 12939076 total |
| bob | 6467737 | 6467671 | 2155912.33 msg/s | 2155890.33 msg/s | 12935408 total |
| charlie | 6468244 | 6468190 | 2156081.33 msg/s | 2156063.33 msg/s | 12936434 total |
| diana | 6470678 | 6470630 | 2156892.67 msg/s | 2156876.67 msg/s | 12941308 total |
| eve | 6470897 | 6470855 | 2156965.67 msg/s | 2156951.67 msg/s | 12941752 total |
| frank | 6468520 | 6468484 | 2156173.33 msg/s | 2156161.33 msg/s | 12937004 total |
| grace | 6468537 | 6468507 | 2156179.0 msg/s | 2156169.0 msg/s | 12937044 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
)