ISAC-Sim

Research Tasks

Standardized simulation scenarios for 5G NR Sidelink and ISAC optimization

Symbion includes two research-oriented simulation tasks with standardized interfaces for iterative decision-making, suitable for numerical optimization methods, online learning approaches, heuristic planners, and external decision-making systems:

TaskDescriptionProblem Type
U2U-MCS5G NR Sidelink MCS adaptive selectionSequential decision-making
ISAC TrajectoryUAV trajectory optimization with LoS awarenessConstrained optimization

Key Features

  • Reproducibility: All simulations support seeded random number generation
  • Standardized Interface: Step/reset pattern for iterative decision-making
  • Rich Logging: JSONL and CSV output formats for analysis
  • Multiple Baselines: Pre-implemented baseline algorithms for comparison

Installation & Setup

Prerequisites

  • Node.js 18+
  • TypeScript 5+
  • npm or pnpm

Installation

# Clone the repository
git clone https://github.com/YUJX19/Symbion.git
cd Symbion

# Install dependencies
npm install

# Build the project
npm run build

Running Examples

# Run U2U-MCS simple example
npx tsx benchmarksu2u-mcssimple-example.ts

# Run ISAC Trajectory simple example
npx tsx benchmarksisac-los-urllcsimple-example.ts

1. U2U-MCS Task

Task Description

Goal: Select the optimal Modulation and Coding Scheme (MCS) index (0-22) in a dynamic UAV-to-UAV communication scenario to maximize throughput while maintaining Block Error Rate (BLER) below target. This is formulated as a sequence prediction task.

  • Scenario: Two UAVs communicate via 5G NR Sidelink
  • Challenge: Channel quality varies due to mobility and fading
  • Decision Frequency: MCS selection at each TTI (1ms)
  • Trade-off: Higher MCS = higher throughput but higher BLER risk

Quick Start

import { u2uMcs } from 'symbion/tasks';
import { createRng } from 'symbion/core';

const env = u2uMcs.createEnvironment(u2uMcs.PAPER_SCENARIO_CONFIG);
const policy = new u2uMcs.GreedyMcsPolicy(u2uMcs.PAPER_SCENARIO_CONFIG);
const rng = createRng(42);

// Reset environment and policy
const { input, info } = await env.reset(42);
policy.reset();

// Run simulation loop
let currentInput = input;
let done = false;

while (!done) {
  // Convert vector input to structured input if needed
  // (Greedy policy often handles raw input or specialized conversion)
  
  // Make decision
  const output = policy.decide(currentInput, rng);
  
  // Step environment
  const result = await env.step(output);
  console.log(`Step ${result.info.step}: Throughput=${result.info.throughput} BLER=${result.info.bler}`);
  
  currentInput = result.input;
  done = (result.info.step >= 1000); // Check termination condition
}

Input & Output Spaces

Input Space

Shape: [7] (Normalized)

  • SINR (dB/30)
  • Distance (d/200m)
  • Relative Speed (v/30 m/s)
  • Recent ACK Rate [0, 1]
  • Recent BLER [0, 1]
  • Last MCS (idx/22)
  • Normalized Step [0, 1]

Output Space

Discrete: 23 options (MCS 0-22)

  • 0: QPSK (SE=0.23)
  • 5: QPSK (SE=0.89)
  • 10: 64QAM (SE=2.41)
  • 15: 64QAM (SE=3.90)
  • 20: 256QAM (SE=5.12)
  • 22: 256QAM (SE=5.89)

Reward Function

R = w_thr * (throughput  max_throughput) 
    - w_bler * max(0, BLER - BLER_target)
    - w_switch * I(MCS_changed)

// Where:
// - w_thr: Throughput reward weight (default: 1.0)
// - w_bler: BLER penalty weight (default: 100.0)
// - w_switch: MCS switch penalty (default: 0.1)

Baseline Policies

1. Fixed MCS

Always select MCS=N (conservative or aggressive)

2. Random

Random MCS selection (baseline)

3. Greedy

Select highest MCS meeting BLER target (SINR-based heuristic)

4. BLER-Adaptive

Adjust MCS based on recent BLER (reactive approach)

5. OLLA

Outer Loop Link Adaptation (standard 3GPP algorithm)

2. ISAC Trajectory Task

Task Description

Goal: A constrained trajectory optimization problem that generates UAV flight paths considering Line-of-Sight (LoS) persistence, URLLC constraints, and sensing-communication trade-offs.

Key Objectives:

  • Maximize throughput to all users
  • Maintain LoS persistence (>70% target)
  • Satisfy URLLC constraints (<5% violation rate)
  • Minimize energy consumption
  • Maintain sensing coverage (>50% target)

Quick Start

import { isacTrajectory } from 'symbion/tasks';
import { createRng } from 'symbion/core';

// Create configuration (using defaults for example)
const config = isacTrajectory.createConfig({
  startPosition: { x: 0, y: 0, z: 50 },
  endPosition: { x: 500, y: 500, z: 80 }
});

const env = new isacTrajectory.IsacTrajectoryEnvironment(config);
const rng = createRng(123);

// Reset environment
const { input } = await env.reset(123);
let currentInput = input;

// Simple trajectory optimization loop
for (let i = 0; i < 100; i++) {
  // Your optimization algorithm here
  // For example, simple hover (zero movement)
  const output = [0, 0, 0]; 
  
  const result = await env.step(output);
  
  console.log('LoS:', result.info.losStatus);
  console.log('URLLC Satisfied:', result.info.urllcSatisfied);
  
  currentInput = result.input;
}

Input & Output Spaces

Input Space (Variable)

Shape: [9 + 4*N] (N = num users)

  • UAV State: Pos[3], Vel[3], Energy[1]
  • Global State: LoS%[1], Progress[1]
  • Per User [N]: LoS Status, SINR, Distance, URLLC Status

Output Space

Continuous or Discrete

  • Continuous: 3D position offset [dx, dy, dz] in range [-1, 1]
  • Discrete: 27 directions (3x3x3 grid including hover)

Reward Function

R = w_thr * (throughput  maxThroughput)
    + w_los * losPercentage
    - w_energy * (stepEnergy  maxStepEnergy)
    - w_urllc * (urllcViolations  numUrllcUsers)
    - w_sensing * max(0, sensingTarget - sensingCoverage)

Baseline Policies

1. Hover

Stay at initial position (baseline energy efficiency)

2. Random

Random movement direction (exploration baseline)

3. Rate-Only

Move toward user with lowest SINR (greedy throughput)

4. Energy-Efficient

Minimize energy while maintaining coverage (energy-focused)

5. Proposed

Balance LoS, throughput, energy, and URLLC (multi-objective)

Running Benchmarks

U2U-MCS Benchmarks

# Run all baseline policies
npx tsx benchmarksu2u-mcsrun-all-baselines.ts

# Compare performance
npx tsx benchmarksu2u-mcscompare-policies.ts

# Output: resultsu2u-mcsmetrics.csv

ISAC Trajectory Benchmarks

# Run trajectory planners
npx tsx benchmarksisac-trajectoryrun-planners.ts

# Evaluate metrics
npx tsx benchmarksisac-trajectoryevaluate.ts

# Output: resultsisac-trajectoryperformance.json