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
populationSizeintNSGA-II population size (default 100, the reference value).
seedint?Random seed (seeds both NSGA-II and, separately, the CMIX stream).
cmixProbdoubleProbability a child is replaced by a CMIX sample past the warm-up (default 0.02).
cmixWindowstringRecent-window size for the metric fit:
"auto"(= 3·populationSize) or an integer string.cmixRidgedoubleRidge regularization for the metric regression (default 1.0).
cmixLambdadoubleLevenberg–Marquardt damping added before inverting the metric (default 1.0).
cmixSigmadoubleNormalized step size scaling the inverse-curvature covariance (default 0.002).
cmixStartGenerationintWarm-up in generations, used only when
cmixStartTrialisnull(default 3).cmixStartTrialint?Warm-up in trials before CMIX may fire;
nullderives it fromcmixStartGeneration(default 100).componentAttrstringUser-attribute key the CMIX metric reads each trial's residual vector from. The default is
component_losses, the keytrial.SetComponentLosseswrites.A custom key is read exactly as given, so store the vector with
trial.SetUserAttr(componentAttr, …). Only the default key also accepts the legacyraealias.CMIX fits the component metric only when every trial in its window carries a numeric vector under this key; otherwise it uses
scalarFallback.nullturns the component channel off.scalarFallbackstringScalar metric when no components are present:
diag_quadratic(default) ornone.mutationBaseMutationNSGA-II mutation (forwarded).
mutationProbdouble?NSGA-II mutation probability (forwarded).
crossoverBaseCrossoverNSGA-II crossover (forwarded).
crossoverProbdoubleNSGA-II crossover probability (forwarded, default 0.9).
swappingProbdoubleNSGA-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
studyStudyStudy supplying trial history, directions, and storage.
trialFrozenTrialCurrent trial snapshot; copy it before modifying its contents.
searchSpaceOrderedDict<string, BaseDistribution>Distributions returned by InferRelativeSearchSpace(Study, FrozenTrial).
Returns
- OrderedDict<string, object>
Jointly sampled external parameter values; omitted parameters use independent sampling.