Skip to content

Add roaming simulator evaluation#4

Open
sergio-gimenez wants to merge 15 commits into
feature/static-mobility-frontendfrom
feature/roaming-simulator-eval
Open

Add roaming simulator evaluation#4
sergio-gimenez wants to merge 15 commits into
feature/static-mobility-frontendfrom
feature/roaming-simulator-eval

Conversation

@sergio-gimenez

Copy link
Copy Markdown
Collaborator

Summary

  • add roaming config, counters, histories, and CSV export fields
  • model roamer entry and inter-PLMN border semantics for 5G and 6G-RUPA
  • add national runner roamer fraction argument and roaming output block
  • add roaming TDD coverage for defaults, border semantics, entry charging, lifecycle injection, and post-entry intra-visited handovers

Testing

  • julia --project -e 'include("test/RoamingTests.jl")' passes: 43/43
  • julia --project -e 'using Pkg; Pkg.test()' reports 393 passed, 1 failed: pre-existing Aqua stale-deps for StatsPlots and Plots

compose_topologies(home, visited) accepted exactly two single-operator
topologies and concatenated them — sufficient for the Iberia §7.4 roaming
scenario (K=2, Movistar + MEO) but not for the federation "network of
networks" vision in §7.5.1 where K≥3 operator fields share one topology.

Replace the fixed two-argument signature with a K-ary vector form:

  compose_topologies(members::Vector{NetworkTopology}; operators=1:K)

Members are concatenated in order with edge/PSA indices offset per
preceding member, gNBs and PSAs tagged by operator id. Municipalities
are deduplicated by code so that overlapping members (two operators
covering the same country) do not double-count population weight, while
every member's infrastructure stays in — the placement distribution
reflects real population, the roaming trigger reflects real coverage.

A backward-compatible two-argument method delegates to the K-ary form,
preserving the existing Iberia call sites unchanged.
Add the pan-Iberian federation scenario: K real operator fields (existing
OpenCellID data, no new downloads) composed into one shared topology, K
swept 2..5. The K=2 prefix reproduces the Iberia §7.4 baseline (Movistar
+ MEO); K≥3 exercises the federation vision where agent fields overlap
and inter-operator crossings become routine attach-to-best-coverage
events — the per-crossing σ decides viability.

run_federation.jl drives the sweep across three mobility models
(pedestrian / urban / highway) with configurable semantics
(:reestablish | :ideal_ho), agent count, and duration. It prints the
agreement-mesh growth analytic alongside the sim: 5G needs O(K(K-1)/2)
bilateral agreements (GSMA NG.113 §4.2 Model 1; Models 2.3/3/4 add
Group SEPPs, aggregators and Roaming Hubs to compress that mesh), RUPA
needs O(K) enrollments into the shared internetwork DIF.

FederationTests.jl covers:
- K-ary compose: offsets, operator tags, merged population weights
- overlapping members: shared municipalities counted once, infra kept
- custom operator ids
- 2-ary backward compat delegates to K-ary
- crossings among 3 members each charge σ, intra-member moves do not;
  roam stretch samples accumulate on every handover while abroad, not
  only at crossings (HR hairpin persists for the whole visit)

All 452 tests pass.
…y collisions

The K-ary compose_topologies deduplicated municipalities by code alone,
but Int-normalized codes collide across countries: Spain INE and
Portugal DICO share numeric ranges, so "1001" in Spain (Alegría-
Dulantzi) and "1001" in Portugal (Aveiro) are different places. The
old key collapsed them into one, dropping population weight — Iberia
showed 8310 municipalities instead of 8322.

Key is now (code, name). Same code + same name = same place (dedup);
same code + different name = different places (both kept). Adds a
regression test that composes two fields with colliding codes and
verifies both municipalities survive with correct population weights.

All 454 tests pass (2 new).
Move the 20 run scripts scattered at the repo root into two directories:

  runs/           — parametric, dispatcher-friendly scripts (national,
                    iberia, federation, deployment_sweep, churn_data,
                    trajectories)
  runs/legacy/    — one-off diagnostic and debugging scripts superseded
                    by the parametric runs (mobility_eval v1/v2/v3,
                    spain_focused, spain_forced_handover, etc.)

Each script's header comment is normalized to show invocation via the
upcoming main.jl dispatcher (`julia --project main.jl <run> [args...]`)
instead of direct `julia --project run_X.jl`. Data and config paths
switch from `@__DIR__` (which broke once scripts moved out of root) to
`pkgdir(DesJulia6gRupa)` so they resolve correctly regardless of where
the dispatcher is invoked from.
Replace the old interactive-only main.jl (3-option menu: run sim / plot
/ quit) with a dispatcher that supports both interactive and command-
line invocation:

  julia --project main.jl                       # interactive menu
  julia --project main.jl list                  # list available runs
  julia --project main.jl national spain        # parametric dispatch
  julia --project main.jl iberia reestablish 500 300
  julia --project main.jl federation reestablish 0 1200 all

The dispatcher auto-discovers runs/*.jl and runs/legacy/*.jl, parses
each script's header comment for description and usage examples, and
injects user args into ARGS before include(). The interactive menu
shows current runs, legacy runs (behind a submenu), and keeps the
original simulation/plot entries. Old direct-invocation examples in
script headers are normalized to the dispatcher form by parse_header.
Point all reproduction commands and file references at the new
main.jl dispatcher and runs/ directory structure:

- INFOCOM_PAPER_STATUS.md: `run_national.jl` → `main.jl national`,
  `run_minimal_topology.jl` → `runs/legacy/run_minimal_topology.jl`
- README.md: `run_deployment_sweep.jl` → `main.jl deployment_sweep`
- docs/agents/countries/portugal.md: `run_national.jl portugal` →
  `main.jl national portugal`, `run_iberia.jl` → `main.jl iberia`
- frontend/README.md: `gen_trajectories.jl` → `main.jl trajectories`
- frontend/index.html: bundle-not-found message updated to suggest
  `main.jl trajectories` invocation
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant