Random Hi Messages - 7 Actors

Generated by GenServerVirtualTime โ€ข Mermaid Flowchart

๐Ÿ“ˆ Simulation Summary

Virtual Time
3000ms
Real Time
76ms
Speedup
39.5x
Termination
โฑ Max Time

๐Ÿ“Š Actor Topology

flowchart LR alice("alice
๐Ÿ“ค Sent: 6799
๐Ÿ“ฅ Recv: 6709") bob("bob
๐Ÿ“ค Sent: 6750
๐Ÿ“ฅ Recv: 6678") charlie("charlie
๐Ÿ“ค Sent: 6925
๐Ÿ“ฅ Recv: 6865") diana("diana
๐Ÿ“ค Sent: 6945
๐Ÿ“ฅ Recv: 6897") eve("eve
๐Ÿ“ค Sent: 7029
๐Ÿ“ฅ Recv: 6987") frank("frank
๐Ÿ“ค Sent: 7366
๐Ÿ“ฅ Recv: 7330") grace("grace
๐Ÿ“ค Sent: 7496
๐Ÿ“ฅ Recv: 7460") frank -->|:hi
every 450ms| diana eve -->|:hi
every 400ms| charlie grace -->|:hi
every 500ms| charlie diana -->|:hi
every 350ms| frank diana -->|:hi
every 350ms| eve charlie -->|:hi
every 300ms| grace frank -->|:hi
every 450ms| bob alice -->|:hi
every 200ms| charlie bob -->|:hi
every 250ms| eve eve -->|:hi
every 400ms| frank bob -->|:hi
every 250ms| alice eve -->|:hi
every 400ms| alice charlie -->|:hi
every 300ms| eve charlie -->|:hi
every 300ms| diana eve -->|:hi
every 400ms| bob grace -->|:hi
every 500ms| frank grace -->|:hi
every 500ms| bob diana -->|:hi
every 350ms| alice frank -->|:hi
every 450ms| alice frank -->|:hi
every 450ms| grace bob -->|:hi
every 250ms| frank alice -->|:hi
every 200ms| diana bob -->|:hi
every 250ms| diana diana -->|:hi
every 350ms| bob grace -->|:hi
every 500ms| eve grace -->|:hi
every 500ms| alice alice -->|:hi
every 200ms| eve charlie -->|:hi
every 300ms| alice diana -->|:hi
every 350ms| grace frank -->|:hi
every 450ms| eve frank -->|:hi
every 450ms| charlie charlie -->|:hi
every 300ms| bob bob -->|:hi
every 250ms| grace alice -->|:hi
every 200ms| bob charlie -->|:hi
every 300ms| frank eve -->|:hi
every 400ms| diana grace -->|:hi
every 500ms| diana alice -->|:hi
every 200ms| grace alice -->|:hi
every 200ms| frank eve -->|:hi
every 400ms| grace bob -->|:hi
every 250ms| charlie diana -->|:hi
every 350ms| charlie 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 6799 6709 2266.33 msg/s 2236.33 msg/s 13508 total
bob 6750 6678 2250.0 msg/s 2226.0 msg/s 13428 total
charlie 6925 6865 2308.33 msg/s 2288.33 msg/s 13790 total
diana 6945 6897 2315.0 msg/s 2299.0 msg/s 13842 total
eve 7029 6987 2343.0 msg/s 2329.0 msg/s 14016 total
frank 7366 7330 2455.33 msg/s 2443.33 msg/s 14696 total
grace 7496 7460 2498.67 msg/s 2486.67 msg/s 14956 total
Summary: Total messages: 98236 โ€ข 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 available_targets != [] 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

# Draw the message flow
mermaid = ActorSimulation.trace_to_mermaid(simulation, enhanced: true)

{:ok, _path} =
  ActorSimulation.write_flowchart_report(simulation, "random_hi_report.html",
    title: "Random Hi Messages - 7 Actors",
    model_source: model_source
  )