Pareto Analysis
Analyze and interpret multi-objective Pareto fronts from optimization campaigns.
Pareto Analysis
When optimizing multiple conflicting objectives, there is no single best solution. Instead, MatCraft returns the Pareto front — the set of non-dominated solutions that represent optimal trade-offs. This page explains how to compute, visualize, and interpret Pareto fronts.
Non-Domination
A solution A dominates solution B if A is at least as good as B in all objectives and strictly better in at least one. A solution is non-dominated (Pareto-optimal) if no other solution dominates it.
For example, with two maximization objectives:
| Candidate | Strength (MPa) | Toughness (J/m2) | Status | |—————-|————————|—————————-|————| | A | 500 | 120 | Pareto-optimal | | B | 450 | 150 | Pareto-optimal | | C | 400 | 110 | Dominated by A and B | | D | 520 | 90 | Pareto-optimal |
Candidates A, B, and D form the Pareto front. Candidate C is dominated because B is better in both strength (450 > 400) and toughness (150 > 110).
Hypervolume Indicator
The hypervolume indicator measures the quality of a Pareto front by computing the volume of objective space that is dominated by the front, relative to a reference point. A larger hypervolume indicates a better Pareto front in terms of both convergence (closeness to the true optimum) and diversity (spread across the front).
MatCraft computes the hypervolume at each iteration and uses its improvement rate for convergence detection.
Viewing the Pareto Front
# Print Pareto-optimal solutions
materia results --pareto
# Show all solutions with domination status
materia results --all --show-dominated
# Export Pareto front to CSV
materia export --pareto --format csvProgrammatic Analysis
from materia.analysis.pareto import compute_pareto_front, hypervolume
# Compute Pareto front from objective arrays
# objectives: np.ndarray of shape (n_candidates, n_objectives)
# directions: list of "maximize" or "minimize"
pareto_mask = compute_pareto_front(objectives, directions)
pareto_solutions = objectives[pareto_mask]
# Compute hypervolume
ref_point = [0.0, 0.0] # Must be dominated by all Pareto points
hv = hypervolume(pareto_solutions, ref_point, directions)
print(f"Hypervolume: {hv:.4f}")Selecting a Solution from the Pareto Front
The Pareto front presents options, but ultimately you need to pick one design. Common selection strategies:
1. Knee-Point Selection
The knee point is the solution on the Pareto front with maximum curvature — the point where a small sacrifice in one objective yields the largest gain in another. It is often considered the "best compromise" solution.
from materia.analysis.pareto import find_knee_point
knee = find_knee_point(pareto_solutions, directions)
print(f"Knee-point solution: {knee}")2. Weighted Preference
Assign weights to objectives based on application requirements, then select the solution that minimizes the weighted distance to the ideal point:
from materia.analysis.pareto import weighted_selection
# Prefer strength 3x more than toughness
selected = weighted_selection(
pareto_solutions,
weights=[3.0, 1.0],
directions=["maximize", "maximize"],
)3. Constraint-Based Filtering
Filter the Pareto front to only solutions meeting minimum requirements, then select among the remaining:
# Only consider solutions with salt rejection >= 97%
filtered = pareto_solutions[pareto_solutions[:, 1] >= 97.0]
# Among those, pick the one with highest permeability
best = filtered[filtered[:, 0].argmax()]Crowding Distance
Crowding distance measures how isolated a Pareto solution is from its neighbors on the front. Solutions with high crowding distance are in sparse regions and contribute more to the diversity of the front. MatCraft reports crowding distance alongside Pareto solutions:
materia results --pareto --show-crowdingVisualization
The MatCraft dashboard provides interactive Pareto plots:
- 2D Pareto scatter: For two-objective problems, a scatter plot with the Pareto front highlighted.
- 3D Pareto surface: For three-objective problems, a 3D surface rendering.
- Parallel coordinates: For 4+ objectives, parallel coordinate plots show all trade-offs simultaneously.
materia dashboardComparing Campaigns
To compare Pareto fronts from different campaigns (e.g., different optimizer settings or material formulations):
materia results --compare campaign_a/ campaign_b/ --metric hypervolumeThis reports the hypervolume for each campaign and overlays their Pareto fronts on a single plot.
See Also
- Multi-Objective Optimization for background theory
- Convergence for how hypervolume drives stopping criteria