Optimize
metasurface_py.optimize
Optimization module for metasurface phase configuration.
MaxCapacityObjective
dataclass
Maximize MIMO capacity for an RIS-assisted link.
Returns negative capacity (for minimization).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
mimo_link
|
Any
|
MIMORISLink instance. |
required |
snr_linear
|
float
|
Total SNR (linear). |
100.0
|
__call__(state, surface, freq, **kwargs)
Evaluate: returns negative capacity.
MaxGainObjective
dataclass
Maximize directivity in a target direction.
Returns negative gain (for minimization).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
target_theta
|
float
|
Target polar angle [rad]. |
required |
target_phi
|
float
|
Target azimuthal angle [rad]. |
required |
angles
|
AngleGrid
|
Observation angle grid for pattern evaluation. |
required |
__call__(state, surface, freq, **kwargs)
Evaluate: returns negative peak gain (minimize this).
MinSidelobeObjective
dataclass
Minimize peak sidelobe level.
Returns positive SLL (in dB, closer to 0 is worse).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
target_theta
|
float
|
Main beam polar angle [rad]. |
required |
target_phi
|
float
|
Main beam azimuthal angle [rad]. |
required |
angles
|
AngleGrid
|
Observation angle grid. |
required |
exclusion_radius
|
float
|
Angular exclusion around main beam [rad]. |
0.15
|
__call__(state, surface, freq, **kwargs)
Evaluate: returns negative SLL (minimize for lower sidelobes).
OptimizationResult
dataclass
Result of a metasurface optimization run.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
state
|
SurfaceState
|
Final optimized surface state. |
required |
state_continuous
|
SurfaceState | None
|
Pre-quantization continuous state (if applicable). |
None
|
objective_value
|
float
|
Final objective function value. |
0.0
|
convergence_history
|
NDArray[floating[Any]]
|
Objective value per iteration. |
(lambda: array([], dtype=float64))()
|
runtime_seconds
|
float
|
Wall-clock time for optimization. |
0.0
|
method
|
str
|
Name of the optimization method used. |
''
|
config
|
dict[str, Any]
|
Frozen dict of all optimization parameters. |
dict()
|
ParetoResult
dataclass
Result of a Pareto sweep.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
states
|
list[SurfaceState]
|
List of Pareto-optimal surface states. |
required |
objective_values
|
NDArray[floating[Any]]
|
(n_points, 2) array of objective values. |
required |
weights
|
NDArray[floating[Any]]
|
(n_points,) array of alpha weights used. |
required |
obj_a_name
|
str
|
Name of first objective. |
'Objective A'
|
obj_b_name
|
str
|
Name of second objective. |
'Objective B'
|
WeightedGainSidelobeObjective
dataclass
Weighted combination of gain and sidelobe level.
objective = alpha * (-gain_dBi) + (1-alpha) * (-SLL_dB)
Lower is better for both terms.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
target_theta
|
float
|
Target beam direction [rad]. |
required |
target_phi
|
float
|
Target beam azimuthal angle [rad]. |
required |
angles
|
AngleGrid
|
Observation angle grid. |
required |
alpha
|
float
|
Weight for gain term (0 to 1). Default 0.7. |
0.7
|
exclusion_radius
|
float
|
SLL exclusion radius [rad]. |
0.15
|
__call__(state, surface, freq, **kwargs)
Evaluate weighted objective.
optimize_continuous(objective, surface, freq, angles, method='L-BFGS-B', x0=None, maxiter=200, seed=None, **scipy_kwargs)
Optimize continuous phase values using SciPy.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
objective
|
Callable[[NDArray[floating[Any]], Metasurface, float], float]
|
Callable(state, surface, freq) -> float to minimize. |
required |
surface
|
Metasurface
|
Metasurface object. |
required |
freq
|
float
|
Frequency [Hz]. |
required |
angles
|
AngleGrid
|
Observation angles (passed through for reference). |
required |
method
|
Literal['L-BFGS-B', 'differential_evolution']
|
"L-BFGS-B" (local) or "differential_evolution" (global). |
'L-BFGS-B'
|
x0
|
NDArray[floating[Any]] | None
|
Initial phase values [rad]. Random if None. |
None
|
maxiter
|
int
|
Maximum iterations. |
200
|
seed
|
int | None
|
Random seed for reproducibility. |
None
|
**scipy_kwargs
|
Any
|
Additional kwargs for the SciPy optimizer. |
{}
|
Returns:
| Type | Description |
|---|---|
OptimizationResult
|
OptimizationResult with optimized continuous state. |
pareto_sweep(objective_a, objective_b, surface, freq, angles, n_points=11, maxiter=100, seed=42, obj_a_name='Objective A', obj_b_name='Objective B')
Generate Pareto front via weighted scalarization.
Sweeps alpha from 0 to 1, optimizing: objective = alpha * obj_a + (1 - alpha) * obj_b
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
objective_a
|
Any
|
First objective callable. |
required |
objective_b
|
Any
|
Second objective callable. |
required |
surface
|
Metasurface
|
Metasurface object. |
required |
freq
|
float
|
Frequency [Hz]. |
required |
angles
|
AngleGrid
|
Observation angles. |
required |
n_points
|
int
|
Number of Pareto points. |
11
|
maxiter
|
int
|
Max iterations per point. |
100
|
seed
|
int
|
Random seed. |
42
|
obj_a_name
|
str
|
Label for first objective. |
'Objective A'
|
obj_b_name
|
str
|
Label for second objective. |
'Objective B'
|
Returns:
| Type | Description |
|---|---|
ParetoResult
|
ParetoResult with states and objective values. |
refine_discrete(objective, surface, state, freq, angles, max_sweeps=3)
Refine a discrete state via coordinate descent.
For each element, tries all codebook entries and keeps the best. Repeats for max_sweeps passes.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
objective
|
Callable[[NDArray[floating[Any]], Metasurface, float], float]
|
Callable(state, surface, freq) -> float to minimize. |
required |
surface
|
Metasurface
|
Metasurface object. |
required |
state
|
SurfaceState
|
Initial discrete surface state. |
required |
freq
|
float
|
Frequency [Hz]. |
required |
angles
|
AngleGrid
|
Observation angles (for reference). |
required |
max_sweeps
|
int
|
Number of full sweeps over all elements. |
3
|
Returns:
| Type | Description |
|---|---|
OptimizationResult
|
OptimizationResult with refined discrete state. |
relax_then_quantize(objective, surface, freq, angles, continuous_method='L-BFGS-B', refine=True, maxiter=200, seed=None)
Optimize via relax-then-quantize pipeline.
- Optimize continuous phases
- Quantize to the surface's discrete codebook
- Optionally refine with coordinate descent
This is the standard approach in metasurface optimization literature and the recommended default workflow.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
objective
|
Callable[[NDArray[floating[Any]], Metasurface, float], float]
|
Callable(state, surface, freq) -> float to minimize. |
required |
surface
|
Metasurface
|
Metasurface object. |
required |
freq
|
float
|
Frequency [Hz]. |
required |
angles
|
AngleGrid
|
Observation angle grid. |
required |
continuous_method
|
Literal['L-BFGS-B', 'differential_evolution']
|
Method for continuous optimization. |
'L-BFGS-B'
|
refine
|
bool
|
Whether to apply discrete refinement after quantization. |
True
|
maxiter
|
int
|
Max iterations for continuous optimization. |
200
|
seed
|
int | None
|
Random seed. |
None
|
Returns:
| Type | Description |
|---|---|
OptimizationResult
|
OptimizationResult with final state and full history. |