Limitations
EM Engine
Large EM simulations are constrained by GPU memory. The main drivers are the number of emitted rays, scattering depth, frequency samples, UEs, antenna elements, and vegetation density.
- Up to 40 million rays per RU are supported over a simulation area up to 25 square kilometers on an NVIDIA L40S GPU.
- Up to 5 scattering events per ray are supported, or up to 10 when transmission is included.
- Wideband CFR supports up to 4096 frequency samples.
- Simulations support up to 10,000 UEs.
- RU panels support up to 64 antenna elements. UE panels support up to 8 antenna elements.
- Vegetation density supports up to 50%.
If a large simulation fails due to resource limits, reduce rays, scattering events, UE density, vegetation density, or disable diffusion.
Additional EM engine constraints:
- Diffraction can occur only once per ray across the selected scattering events.
- Diffuse scattering is limited to direct diffuse paths where the diffuse vertex is line-of-sight to both the RU and UE.
- Rays with transmissions support only specular reflections.
- Built-in antenna models are limited to isotropic, polarized isotropic, infinitesimal dipole, halfwave dipole, microstrip patch, and 3GPP-type RU elements. Other models must be added through custom antenna element or panel files.
- Active Element Patterns can currently be calculated only for halfwave dipoles.
- While each RU can have its own antenna panel with its own antenna setup (antenna number, antenna spacing, antenna pattern, single/dual-polarization), all the RU panels need to have the same frequency operation parameters (carrier frequency, FFT size, subcarrier spacing).
- All UEs in one simulation run need to use the same antenna panel.
RAN Simulation
- RU antenna counts are limited to 64 or 4. UE antenna count is limited to 4.
- Only 100 MHz bandwidth with 273 PRBs is supported.
- Only 30 kHz subcarrier spacing is supported.
- When the RU has 4 antennas, only SU-MIMO is supported and beamforming is not applied.
- When the RU has 64 antennas, regularized ZF beamforming is applied.
- MMSE-IRC is applied at receivers.
- DMRS positions are fixed at symbols 2, 3, 10, and 11.
- PRBs are scheduled at PRB group level, with 4 PRBs per PRB group.
- HARQ, when enabled, operates per slot and allows up to 4 transmissions: one new transmission plus three retransmissions.
- SRS is scheduled only on S slots. S slots are dedicated to SRS.
- For SRS slots, 4-antenna RUs can allocate all 14 symbols for SRS. 64-antenna RUs can allocate only 4 symbols.
- On servers where system RAM is lower than GPU VRAM, back-to-back simulations can be unstable. In extreme cases, the system can hang and require a cold reboot.
MAC Scheduler
- HARQ retransmission is non-adaptive: retransmissions reuse the original PRB allocation, layer selection, and MCS.
- Layer selection is not fully optimized.
- MCS selection uses a SINR-to-MCS lookup table derived for single-layer AWGN transmissions, which may be inaccurate for multi-layer transmissions.
Mobility
Mobility Model
- Manual UEs cannot have waypoints that cross from indoor to outdoor space, or from outdoor to indoor space. The RRT solver fails if this is attempted.
- The RRT3 engine supports only manual users and scatterers. Procedural 3D actor generation is not implemented.
- A 3D user whose waypoints are too close to the terrain surface may fail pathfinding.
- Spawn zone footprints are convex. If input points describe a concave polygon, the mobility model samples the convex hull instead of preserving the concave outline.
- In GPX timed mode, where
use_pathfindingisTrue, only one user ID is supported per GPX request. - Collision detection and terrain projection use CUDA through NVIDIA Warp. A GPU is required.
- RRT distance parameters are tuned for the default scale of 100 centimeters.
RRTConfig.for_scale()adjusts them for other scales, but extreme scale values may need manual tuning. - If a user’s speed is zero at a waypoint, the trajectory is truncated at that point and the user remains stationary for the rest of the simulation.
- If a user’s trajectory is shorter than the simulation duration, the last sample is repeated to pad the output to the expected length.
Urban Mobility (SUMO)
Urban Mobility is experimental.
- The first run with Urban Mobility enabled requires network access to fetch OpenStreetMap data from the Overpass API. The network file is cached and reused for subsequent runs with the same bounding box.
- Manual UEs and UEs created from GPX files are not recognized by the Urban Mobility model, so collisions may occur.
- A spawn zone is required for Urban Mobility and dynamic scattering from cars.
- OSM import can produce road networks that extend beyond the spawn zone, so UE and vehicle trajectories may leave the intended area.
- Overpass API queries are limited to bounding boxes of at most 1.0 square degrees.
- If the road network cannot support the requested number of vehicles or UEs, or if SUMO actors lack enough timesteps or have trajectory points inside buildings, fewer actors may be generated.
- Vehicle and UE random trips may end before the requested duration. AODT attempts rerouting to keep actors in the simulation.
- If rerouting is not possible, actors may stay stationary after reaching their target.
- In duration/interval simulations,
intervalcannot exceed 100 ms because larger intervals can make vehicle motion appear jittery. - SUMO simulates vehicles as points, not volumes. The viewer renders those points as 3D vehicle models, so two vehicles whose SUMO point positions are close together can appear to overlap or collide even though SUMO considers them separate. This is a visual artifact of the mismatch between SUMO’s point-based simulation and the volumetric rendering in the viewer.
- SUMO trajectory sampling interpolates the Z coordinate linearly between waypoints. When two consecutive waypoints lie on opposite sides of a terrain ridge or crevice, the interpolated positions can dip below the terrain surface, causing vehicles to appear partially submerged. This is more likely on maps with abrupt elevation changes. To mitigate, generate maps with higher terrain fidelity or reduce the sampling interval so waypoints are closer together.
Calibration
Calibration limitations fall into two phases:
- Simulation before calibration — constrains the AODT simulation that must be aligned and traced before calibration: link geometry, antenna setup, scene RF interactions, and the GIS/vegetation scene.
- Calibration process — arises from the inverse calibration run itself: the power-based, narrowband, under-constrained fit that recovers materials and orientations from the imported rays and measurements.
See Simulation setup and Calibration for the full workflow.
1. Simulation before calibration
These constrain the simulation that precedes calibration. They must be satisfied while building and tracing the aligned scene (see Simulation setup).
Trace-time requirements:
- Use GPX-driven UE samples with
use_pathfinding: false, correct map georeferencing, and one measurement row per GPX sample. - Trace calibration inputs with a
1 × 1RU panel at the panel phase center, accurate RU position, and accurateaerial_gnb_height. - Enable the RF interactions and scene assets that calibration must later observe, including transmission, diffuse scattering, diffraction, and vegetation when those targets matter.
- Do not rely on scatterers as calibration targets. Calibration consumes a restricted band, so avoid the full broadband grid unless the campaign requires it.
FAQ - Simulation before calibration
UEs
- Does changing UE speed in the simulation config during calibration move the calibration samples differently? No. With
use_pathfinding: false, GPX samples define the time IDs directly and there is no temporal dependency from simulated UE speed. - Does changing
durationorintervalduring calibration create more calibration samples? No. The number of GPX samples has already defined the realizations used by calibration. What is the difference between UEs to calibrate and any other UE? The simulation can contain multiple UEs from:
- indoor sources;
- procedural sources;
- manual placement;
- GPX with pathfinding enabled;
- GPX with pathfinding disabled.
Only one UE is targetable by calibration; all other UEs remain part of the simulation.
- Can I change the UE antenna pattern during calibration? Yes. The UE antenna pattern does not affect the tracing step and mostly impacts the EM level.
- Can changing UE georeferencing during calibration repair a misplaced route? No. Wrong georeferencing changes the traced geometry, so the aligned scene must be fixed and traced before calibration.
RUs
- Can editing
aerial_gnbradiated power during calibration align simulated RU power with the campaign? No. Adjust the simulated power level and re-run the simulation so the imported rays and measurements are aligned. - Does changing the RU 3D position during calibration update the ray geometry? No. RU position affects traced geometry, so position changes require re-running the simulation.
- Does changing
aerial_gnb_heightduring calibration update the effective antenna height in imported rays? No. The effective antenna height was already used when tracing the simulation. - Does replacing the
1 × 1RU panel with a multi-element panel during calibration improve beam recovery? No. The calibration input should be traced with the single-element phase-center panel; changing it later does not re-trace rays. - Why run the first simulation with a
1 × 1single-polarized panel instead of the final panel configuration? The1 × 1panel places traced paths at the panel center. Calibration then applies the array factor from whichever panel configuration is specified for calibration, using that central path. - Can switching to an isotropic RU pattern during calibration simplify the fit? No. Isotropic antenna patterns are not allowed for RU or UE calibration inputs.
Materials and vegetation
- Can enabling
AerialRFTransmissiononly in the calibration YAML add through-wall paths? No. Transmission paths must be enabled before tracing; otherwise the imported rays do not contain them. - Can enabling diffuse scattering only during calibration recover diffuse material behavior? No. Diffuse paths must exist in the traced rays before calibration can constrain diffuse-related coefficients.
- Can calibration create diffraction events when diffraction was disabled in simulation? No. Calibration cannot create missing interaction events; re-run the simulation with diffraction enabled.
- Can vegetation materials be recovered by turning vegetation on during calibration after tracing without vegetation? No. Vegetation must be active and present in the traced scene before calibration.
- Do existing ray paths start hitting tree assets added during calibration? No. Assets must intersect the campaign paths during the simulation trace to produce vegetation interactions.
General setup
- What happens when the ray count is changed from 500k to 2M during calibration? Nothing. Ray tracing does not happen during calibration, so the imported ray set stays the same.
- Can the center frequency be changed after simulation? Yes. Changing frequency does not change ray geometry, so it can be updated after tracing.
- Does calibration use all subcarriers from a full broadband simulation? No. Calibration consumes a restricted band.
- Can scatterers added during calibration become calibration targets? No. Scatterers are not supported as calibration targets.
- Do imported ray paths change when spawn or procedural scatterer settings change during calibration? No. Do not rely on scatterer-only paths or spawn/procedural-placement settings as calibration inputs.
2. Calibration process
These limits apply after the simulation rays and measurements have already been imported. They describe what the inverse, power-based, narrowband fit can recover from those inputs (see Calibration).
UE orientation
For more on training, refer to Intro to Calibration -> 3.3 UEs.
- Calibration can correct UE orientation only; UE positions remain the positions imported from the aligned simulation input.
- Position error is absorbed as orientation or material residual, so large GPX errors or arbitrary handset motion cannot be recovered as clean tilt, azimuth, or roll corrections.
- There is roughly a 1 m uncertainty confidence range around UE positioning, but tighter measurements are still strongly recommended.
- UE orientation training is bounded to from 0° to 75°, from -30° to +30°, and from -45° to +45°.
Automatic turn off. The UE orientation target is not turned off
automatically. Once cal.targets.UEs is set to true it stays enabled for the
whole run — there is no automatic disabling based on the imported rays.
RU orientation
For more on training, refer to Intro to Calibration -> 3.3 RUs.
cal.targets.RUs — bounded correction on seeded mounting angles (tilt, azimuth, panel roll):
- Calibration refines the seeded RU orientation within the -30° to +30° correction range.
- If the true mounting angle is outside that window, calibration cannot discover it from scratch. This is especially limiting for directive RU antennas because power-only observations do not uniquely identify absolute orientation when the initial angle is too far away.
Automatic turn off. The RU orientation target is not turned off
automatically. Once cal.targets.RUs is set to true it stays enabled for the
whole run — it is never automatically disabled.
RU beams
For more on training, refer to Intro to Calibration -> 3.3 RUsBeams.
cal.targets.RUsBeams — learned beam codebook on the multi-element calibration array:
- Pre-known beam codebooks cannot be supplied yet — beams are learned only when
cal.targets.RUsBeams: true; support for a user-provided codebook is planned for a future release. - Beam calibration requires measured beam indices.
- Without
beam_idxcolumns, the active beam is unknown and the codebook cannot be identified. - Beam errors can be ambiguous with RU orientation and material errors.
- Treat a recovered codebook as physical only after the RU orientation and material fits are also plausible.
Automatic turn off. Beam calibration is adjusted automatically from the panel and the measurements:
- if the RU panel has only one element, no beams can be formed and beam calibration is turned off;
- if the measurements carry no beam column, beam calibration is removed;
- if some measurements have beams and others do not, the codebook is estimated only from the links that do carry beam indices.
Building / surface material recovery
For more on training, refer to Intro to Calibration -> 3.3 Materials.
- Calibration only adjusts material parameters attached to interactions present in the imported ray paths. Missing transmission, diffuse scattering, or diffraction events stay missing, so their effects are pushed into whichever enabled targets remain.
- Building-material frequency exponents stay fixed. Calibration is narrowband at the carrier frequency and tunes carrier-frequency material behavior, not the full frequency-dependent material law.
- Metallic materials are currently not supported because their conductivity spans too wide a domain for the current material recovery fit.
Automatic turn off. Building / surface material recovery is disabled automatically if the imported rays contain no material interaction at all. In that case, no material output is written.
Vegetation material recovery
For more on training, refer to Intro to Calibration -> 3.3 Vegetation Materials.
- Vegetation materials are observable only when vegetation appears in the imported ray paths.
- If the rays contain vegetation hits, reconstruction quality still depends on ray diversity and hit strength because individual vegetation interactions often carry limited energy.
Automatic turn off. Vegetation material recovery is disabled automatically if the imported rays contain no vegetation hit. In that case, no vegetation output is written.
Maximum trainable simulation size
The maximum supported trainable size depends mostly on active ray count and number of frequencies. The number of interactions has not shown a practical impact.
FAQ - Calibration process
Calibration is in an early alpha stage; open training behaviors are not yet fully specified.
UEs
- Can calibration move UE positions? No. UE positions remain the positions imported from the aligned simulation input.
- How much GPX uncertainty can I tolerate before UE angle recovery becomes misleading? Around 1 m, but tighter GPX and measurement alignment is still recommended.
- When should I disable
cal.targets.UEs? Disable it when the UE angles are known. - How can I separate UE antenna-pattern mismatch from a real orientation correction? Use good prior knowledge of the UE antenna pattern.
- Can roll be estimated alone when the UE time-series tilt and azimuth are known? No. UE orientation is enabled as one block, so tilt, azimuth, and roll cannot be targeted independently.
RUs
- What RU orientation parameters can calibration refine? Calibration refines seeded mounting angles: tilt, azimuth, and panel roll.
- How far can RU orientation be corrected? RU orientation is corrected within the -30° to +30° range around the seeded value.
- Can calibration discover RU orientation from scratch? No. If the true mounting angle is outside the correction range, calibration cannot discover it from scratch.
- When should I disable
cal.targets.RUs? Disable it when the mechanically fixed panel orientation is known. - Does
cal.targets.RUsturn off automatically? No. Once enabled, the RU orientation target stays enabled for the whole run.
RU beams
- Can I supply a pre-known beam codebook? Not yet. Beams are learned only when
cal.targets.RUsBeamsis enabled. - What measurement data is required for beam calibration? Beam calibration requires measured beam indices.
- What happens if the measurements have no beam column? Beam calibration is removed because the active beam is unknown.
- What happens if the RU panel has only one element? Beam calibration is turned off because no beams can be formed.
- What happens if only some measurements have beam indices? The codebook is estimated only from links that carry beam indices.
Building / surface materials
- Can calibration create missing ray interactions? No. Calibration can only adjust material parameters attached to interactions already present in the imported ray paths.
- What happens if no building material interaction is present? The building material target is turned off and no material output is written.
Vegetation materials
- When are vegetation materials observable? Only when vegetation appears in the imported ray paths.
- What affects vegetation reconstruction quality? Ray diversity and vegetation-hit strength, because individual vegetation interactions often carry limited energy.
- What happens if no vegetation hit is present? The vegetation material target is turned off and no vegetation output is written.
Power measurements
- Should I supply real campaign measurements? Yes. Calibration fits against the power levels recorded in the field and never generates or fabricates them. No real measurements, no calibration.
- Is the
<n>inPower_PCI_<n>theru_id? No. The PCI label is only the PCI represented by that CSV. The link is wired throughcal.measurements— correct CSV-to-link pairing is the user’s responsibility. - What ambiguities does power-only calibration have? The problem can be severely under-determined (too many unknowns for the available rays), and the current optimization structure is strongly non-convex, so results are not guaranteed to generalize.
Scale and capacity
- What is the maximum number of polygons? 5000.
- What is the maximum number of epochs? 5500.
- What sample count is recommended for trustworthy results? The sample count alone is not enough to decide. Recoverability depends on the relation between the number of material unknowns and the number of rays: for the same set of materials to retrieve, more rays generally carry more information about them. Ray diversity also matters — not just ray count. Multiple RUs linked to the same UE can improve this ratio because the campaign collects not only more rays but also more varied geometry.
- Can I calibrate from multiple campaigns at once? Calibrating multiple campaigns assigned to the same physical space is currently not supported.
Optimization and convergence
- How do I know training converged? Training embeds a stopping rule: it stops once convergence is reached, which also avoids adding noise to the solution by continuing past that point.
What loss value counts as “good enough”? As a rough guide:
0 – 0.2— excellent;0.2 – 0.5— good;0.5 – 0.75— usable but can be improved;> 1— total failure: the power levels are likely too far off or the configuration is wrong.
What should I check when the loss is too high? Check the setup inputs first:
- map accuracy;
- antenna pattern;
- map georeferencing;
- UE placement;
- RU location;
- tree geojson validity, when vegetation is part of the campaign.
- Can I configure the optimizer, learning rate, or regularization weights? No — these are fixed internally and not user-selectable.
Runs and reproducibility
- Can I re-run calibration multiple times in the same output folder? No. Every calibration run preemptively erases the selected output folder before writing new results, so stale files cannot be confused with the current output.
- Can I re-run calibration multiple times with different output folders? Yes. The same simulation can be calibrated multiple times into different output folders, for example one run for UE angles only and another run for materials only. This workflow is supported, but it has not been proven to improve any calibrated feature.
- Is training deterministic? Yes. Two calibration runs with the same conditions produce the same output.
- Can I resume from a checkpoint rather than starting from scratch? Not yet. Checkpoint resume support is planned for a future release.
- Can I seed or freeze specific materials? No. This feature is currently not supported.
- How do I re-apply the calibrated results to future simulations? Use the post-processing workflow described in Post-processing.
Data and robustness
- How are missing power samples handled during training? Missing power samples are skipped.
- Can very low-power samples or near-zero gradients prevent useful training progress? Samples are equalized so each sample contributes with similar weight, but convergence is weaker when the signal is weak because sensitivity to those parameters drops.
YAML Config Builder
The YAML Config Builder is an authoring and round-trip helper for AODT simulation YAML. It is not a general-purpose editor for arbitrary YAML files. The YAML should be created either from the client library or the Viewer.
General Limitations
- UE IDs are limited to
1through10000. Waypoints for a single UE must all be either 2D or 3D. Spawn zones and bounding-box windows accept only 2D positions. - When registering non-file-based panels through the builder API, panel reference frequencies must match. RU, DU, and panel frequencies are independent fields, so updating one does not update the others automatically.
- File-based panels cannot be modified with panel setters such as
set_frequency,set_antenna_elements,set_spacing_wavelengths,set_panel_size, orset_roll_angles. Their panel details are read from the panel file at runtime. When using a file-based RU panel, set the DU antenna count explicitly because it cannot be derived from the panel shape.
Build YAML From Scratch
- New
SimConfig(...)objects require anassets.ymlfile with scalar.jsonentries fordu,ru,ue,scenario,panels,scatterers,materials,vegetation_materials, andvegetation_assets. - Timeline configuration must use either duration/interval or slots/realizations, not both. RAN mode requires slots/realizations, and
realizations_per_slotsupports only1or14. - The builder enforces object relationships before export: default panels must be registered before adding DUs, RUs, or UEs; an RU must reference an existing DU and panel; and a UE must have at least one waypoint or a GPX source.
Build YAML From Importing Existing YAML
SimConfig.from_yaml_file(...)is intended for YAML generated by the client library or Viewer. Import is semantic, not byte-preserving: comments, anchors, duplicate keys, scalar style, and original ordering are not preserved.- Imported YAML is supposed to be valid for running a simulation. The behavior of importing manually edited YAML is undefined. Imported YAML reads asset defaults from the YAML
sim.*.defaultentries instead of an externalassets.yml.
Build YAML for Calibration
- Calibration YAML should be built by importing the exact base simulation YAML with
SimConfig.from_yaml_file(...)and then callingset_calibration_targets(...). The base simulation run must export theRAYPATHStable; the builder does not infer that when adding calibration settings. - Calibration YAML export also requires at least one calibration measurement and a non-empty output folder key.
UI
- The viewer may become temporarily unresponsive when applying a new YAML, loading data from a database, or connecting to or disconnecting from a server.
- For large scenes, placing vegetation or creating road overlays can cause EM worker heartbeat loss. Detach from the EM worker while staying in the live session, then reattach after the operation finishes.
- For large simulations, such as 100,000 slots or 1,000 UEs, the UI may lose connection with the EM Solver Worker. Use headless mode for large runs.
- When switching maps in the viewer, scenario parameters may disappear and UI console errors may appear. Restart the graphical interface and reopen the map.
GIS
- Map areas up to 25 km² are recommended. Beyond that, map processing time may become prohibitively long. Use a smaller box, or split the region across multiple
prepare_mapcalls to cover more area. - Cesium 3D Tiles emitted with
cesium3dtiles_gzip=True(the default) require the hosting layer to setContent-Encoding: gzip. Hosts that do not set this header will return unreadable tile payloads.