Random Hi Messages - 7 Actors

Generated by GenServerVirtualTime โ€ข Mermaid Flowchart

๐Ÿ“ˆ Simulation Summary

Virtual Time
3000ms
Real Time
35ms
Speedup
85.7x
Termination
โฑ Max Time

๐Ÿ“Š Actor Topology

flowchart LR alice("alice
๐Ÿ“ค Sent: 2275
๐Ÿ“ฅ Recv: 2191") bob("bob
๐Ÿ“ค Sent: 2345
๐Ÿ“ฅ Recv: 2273") charlie("charlie
๐Ÿ“ค Sent: 2417
๐Ÿ“ฅ Recv: 2357") diana("diana
๐Ÿ“ค Sent: 2553
๐Ÿ“ฅ Recv: 2505") eve("eve
๐Ÿ“ค Sent: 2550
๐Ÿ“ฅ Recv: 2514") frank("frank
๐Ÿ“ค Sent: 2677
๐Ÿ“ฅ Recv: 2641") grace("grace
๐Ÿ“ค Sent: 2705
๐Ÿ“ฅ Recv: 2669") bob -->|:hi
every 250ms| alice diana -->|:hi
every 350ms| alice charlie -->|:hi
every 300ms| alice bob -->|:hi
every 250ms| charlie eve -->|:hi
every 400ms| grace charlie -->|:hi
every 300ms| grace eve -->|:hi
every 400ms| charlie frank -->|:hi
every 450ms| bob charlie -->|:hi
every 300ms| frank bob -->|:hi
every 250ms| diana grace -->|:hi
every 500ms| frank grace -->|:hi
every 500ms| eve diana -->|:hi
every 350ms| eve grace -->|:hi
every 500ms| diana grace -->|:hi
every 500ms| bob diana -->|:hi
every 350ms| grace alice -->|:hi
every 200ms| eve grace -->|:hi
every 500ms| alice charlie -->|:hi
every 300ms| diana eve -->|:hi
every 400ms| bob eve -->|:hi
every 400ms| diana eve -->|:hi
every 400ms| frank alice -->|:hi
every 200ms| charlie bob -->|:hi
every 250ms| grace frank -->|:hi
every 450ms| eve alice -->|:hi
every 200ms| diana alice -->|:hi
every 200ms| grace charlie -->|:hi
every 300ms| eve bob -->|:hi
every 250ms| frank diana -->|:hi
every 350ms| charlie charlie -->|:hi
every 300ms| bob frank -->|:hi
every 450ms| alice eve -->|:hi
every 400ms| alice frank -->|:hi
every 450ms| diana alice -->|:hi
every 200ms| bob frank -->|:hi
every 450ms| grace diana -->|:hi
every 350ms| frank frank -->|:hi
every 450ms| charlie diana -->|:hi
every 350ms| bob grace -->|:hi
every 500ms| charlie alice -->|:hi
every 200ms| frank bob -->|:hi
every 250ms| eve style alice fill:#fff3e0,stroke:#f57c00,stroke-width:3px style bob fill:#fff3e0,stroke:#f57c00,stroke-width:3px style charlie fill:#fff3e0,stroke:#f57c00,stroke-width:3px style diana fill:#fff3e0,stroke:#f57c00,stroke-width:3px style eve fill:#fff3e0,stroke:#f57c00,stroke-width:3px style frank fill:#fff3e0,stroke:#f57c00,stroke-width:3px style grace fill:#fff3e0,stroke:#f57c00,stroke-width:3px

Node Shapes (Actor Type)

flowchart TD legend_processor("Processor
(send & receive)") style legend_processor fill:#ffffff,stroke:#666666,stroke-width:2px

Node Colors (Activity Level)

flowchart LR activity_0["๐ŸŸ  High Activity (>50 msgs)"] style activity_0 fill:#fff3e0,stroke:#f57c00,stroke-width:3px

๐Ÿ“‰ Detailed Statistics

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
Summary: Total messages: 34672 โ€ข Duration: 3000ms โ€ข Actors: 7

๐Ÿ’ป Model Source Code

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
)