Table of Contents

Class JanusMooCmixSampler

Namespace
OptunaSharp.Samplers
Assembly
OptunaSharp.dll

Multi-objective JANUS: NSGA-II selection with JANUS-style CMIX candidate generation. Past a warm-up, a small fraction (the constructor's cmixProb option) of children are replaced by an inverse-curvature Gaussian sample drawn from a metric estimated over the recent window — either from component_losses residuals (the recommended mode) or a diagonal-quadratic scalar fallback — centered on a crowding-ranked point. NSGA-II keeps full control of Pareto selection, so this matches or beats the bare NSGA-II host without a significant regression (the paper's headline MOO property). Port of the authors' janus_optuna.JanusMooCmixSampler (arXiv:2608.22862).

Residual coordinates (optional but recommended). If each objective decomposes into components, expose the residual vector per trial via trial.SetComponentLosses(new double[]{ … }); JANUS then estimates the local metric directly from those residuals. Without them it uses a diagonal-quadratic fit on the window's scalarized values.

Hosts. This is the NSGA-II-hosted sampler the reference ships. The same CMIX engine is host-agnostic; SMS-EMOA- and AGE-MOEA-2-hosted variants (for low- and many-objective suites) reuse it — see JanusSmsEmoaCmixSampler and JanusAgeMoea2CmixSampler.

public class JanusMooCmixSampler : NSGAIISampler
Inheritance
JanusMooCmixSampler
Inherited Members

Examples

var study = Optuna.CreateStudy(
    directions: new[] { StudyDirection.Minimize, StudyDirection.Minimize },
    sampler: new JanusMooCmixSampler(populationSize: 50, seed: 0));
study.Optimize(t =>
{
    double x = t.SuggestFloat("x", 0, 1), y = t.SuggestFloat("y", 0, 1);
    return new[] { x, (1 - x) + y };
}, nTrials: 400);

Constructors

JanusMooCmixSampler(int, int?, double, string, double, double, double, int, int?, string, string, BaseMutation?, double?, BaseCrossover?, double, double)

Configures curvature-informed candidate injection into an NSGA-II population.

public JanusMooCmixSampler(int populationSize = 100, int? seed = null, double cmixProb = 0.02, string cmixWindow = "auto", double cmixRidge = 1, double cmixLambda = 1, double cmixSigma = 0.002, int cmixStartGeneration = 3, int? cmixStartTrial = 100, string componentAttr = "component_losses", string scalarFallback = "diag_quadratic", BaseMutation? mutation = null, double? mutationProb = null, BaseCrossover? crossover = null, double crossoverProb = 0.9, double swappingProb = 0.5)

Parameters

populationSize int

NSGA-II population size (default 100, the reference value).

seed int?

Random seed (seeds both NSGA-II and, separately, the CMIX stream).

cmixProb double

Probability a child is replaced by a CMIX sample past the warm-up (default 0.02).

cmixWindow string

Recent-window size for the metric fit: "auto" (= 3·populationSize) or an integer string.

cmixRidge double

Ridge regularization for the metric regression (default 1.0).

cmixLambda double

Levenberg–Marquardt damping added before inverting the metric (default 1.0).

cmixSigma double

Normalized step size scaling the inverse-curvature covariance (default 0.002).

cmixStartGeneration int

Warm-up in generations, used only when cmixStartTrial is null (default 3).

cmixStartTrial int?

Warm-up in trials before CMIX may fire; null derives it from cmixStartGeneration (default 100).

componentAttr string

User-attribute key the CMIX metric reads each trial's residual vector from. The default is component_losses, the key trial.SetComponentLosses writes.

A custom key is read exactly as given, so store the vector with trial.SetUserAttr(componentAttr, …). Only the default key also accepts the legacy rae alias.

CMIX fits the component metric only when every trial in its window carries a numeric vector under this key; otherwise it uses scalarFallback. null turns the component channel off.

scalarFallback string

Scalar metric when no components are present: diag_quadratic (default) or none.

mutation BaseMutation

NSGA-II mutation (forwarded).

mutationProb double?

NSGA-II mutation probability (forwarded).

crossover BaseCrossover

NSGA-II crossover (forwarded).

crossoverProb double

NSGA-II crossover probability (forwarded, default 0.9).

swappingProb double

NSGA-II swapping probability (forwarded, default 0.5).

Methods

SampleRelative(Study, FrozenTrial, OrderedDict<string, BaseDistribution>)

Sample parameters in a given search space.

The trial invokes this method lazily when it first needs relative parameters and caches the result for its remaining suggestions. This method is suitable for sampling algorithms that use relationship between parameters such as Gaussian Process and CMA-ES.

public override OrderedDict<string, object?> SampleRelative(Study study, FrozenTrial trial, OrderedDict<string, BaseDistribution> searchSpace)

Parameters

study Study

Study supplying trial history, directions, and storage.

trial FrozenTrial

Current trial snapshot; copy it before modifying its contents.

searchSpace OrderedDict<string, BaseDistribution>

Distributions returned by InferRelativeSearchSpace(Study, FrozenTrial).

Returns

OrderedDict<string, object>

Jointly sampled external parameter values; omitted parameters use independent sampling.