"Search at Scale: Improving Numerical Conditioning of Ergodic Coverage Optimization for Multi-Scale Domains"
Code repository for the paper Search at Scale: Improving Numerical Conditioning of Ergodic Coverage Optimization for Multi-Scale Domains.
This repository implements trajectory optimization algorithms for scale-invariant ergodic coverage on 3D domains. Trajectories are optimized to match a target information distribution (defined over a point cloud or mesh) while respecting a velocity constraint, using Maximum Mean Discrepancy (MMD) as the coverage objective.
Three techniques are provided to improve numerical conditioning across multi-scale domains:
| Method | Script | Key Feature |
|---|---|---|
| SI-EMMD | scale_invariance/example.py |
Normalizes domain extent prior to optimization |
| Annealing | annealing/example.py |
Cosine-anneals bandwidth from coarse to fine resolution |
| LSE-MMD | lse/example.py |
Replaces sums with log-sum-exp for numerical stability |
scale_emmd/
├── methods/
│ ├── emmd_lib.py # Core Scale_EMMD solver class
│ └── solver_anneal.py # Augmented Lagrangian optimizer
├── annealing/
│ └── example.py # Bandwidth annealing demo
├── lse/
│ └── example.py # LSE loss vs. standard MMD demo
├── scale_invariance/
│ └── example.py # Scale-invariant solver demo
├── obj_files/
│ └── bunny_mesh.obj # Stanford Bunny mesh (test geometry)
├── LICENSE
└── README.md
Requirements: Python 3.9+
pip install jax jaxopt numpy matplotlib open3d trimeshGPU acceleration: For large trajectories or meshes, JAX with GPU support is recommended. See the JAX installation guide for CUDA setup.
All examples run from the repository root. Each script contains a clearly marked configuration block at the top of __main__ — edit those variables to change behavior.
Compares standard EMMD against the scale-invariant variant on a scaled 3D mesh.
python scale_invariance/example.pyConfiguration block (scale_invariance/example.py):
method = 'si-emmd' # Options: 'emmd', 'si-emmd'
scale = 5.0 # mesh scale
h = 0.05 # kernel bandwidth
T = 800 # trajectory lengthSolves coverage on a 3D mesh by annealing the bandwidth from a broad initial value down to one matched to the sensor radius, using a cosine schedule.
python annealing/example.pyConfiguration block (annealing/example.py):
method = 'anneal' # Options: 'emmd', 'anneal'
h = 0.05 # initial bandwidth
sensor_rad = 1.5 # target sensing radius
scale = 10.0 # mesh scale
T = 1000 # trajectory lengthThe target bandwidth is derived automatically as
h_target = sensor_rad² / |log(ε)|withε = 0.05.
Runs the annealing solver with a log-sum-exp (numerically stable) loss in place of the standard MMD sum.
python lse/example.pyConfiguration block (lse/example.py):
lse = True # True: log-sum-exp loss; False: standard MMD
scale = 100.0 # mesh scale
h = 0.05 # starting bandwidth for annealing
sensor_rad = 1.5 # target sensing radius
T = 1000 # trajectory lengthIf you use this code in your research, please cite:
@article{scale_emmd_2026,
title = {Search at Scale: Improving Numerical Conditioning of Ergodic
Coverage Optimization for Multi-Scale Domains},
author = {},
year = {2026},
note = {Intelligent Autonomy Robotics Lab}
}MIT License — Copyright (c) 2026 Intelligent Autonomy Robotics Lab. See LICENSE for details.