{"record":{"id":"b2b4954dc6b5f066","repo":"dotnet/machinelearning","slug":"idatasetmanager-must-be-either-itraintestdatasetma","errorCode":null,"errorMessage":"IDatasetManager must be either ITrainTestDatasetManager or ICrossValidationDatasetManager","messagePattern":"IDatasetManager must be either ITrainTestDatasetManager or ICrossValidationDatasetManager","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.ML.AutoML/AutoMLExperiment/Runner/SweepablePipelineRunner.cs","lineNumber":91,"sourceCode":"            if (_datasetManager is ITrainValidateDatasetManager trainTestDatasetManager)\n            {\n                var model = mlnetPipeline.Fit(trainTestDatasetManager.LoadTrainDataset(_mLContext!, settings));\n                var eval = model.Transform(trainTestDatasetManager.LoadValidateDataset(_mLContext!, settings));\n                var metric = _metricManager.Evaluate(_mLContext, eval);\n                stopWatch.Stop();\n                var loss = _metricManager.IsMaximize ? -metric : metric;\n\n                return new TrialResult\n                {\n                    Loss = loss,\n                    Metric = metric,\n                    Model = model,\n                    DurationInMilliseconds = stopWatch.ElapsedMilliseconds,\n                    TrialSettings = settings,\n                };\n            }\n\n            throw new ArgumentException(\"IDatasetManager must be either ITrainTestDatasetManager or ICrossValidationDatasetManager\");\n        }\n\n        public Task<TrialResult> RunAsync(TrialSettings settings, CancellationToken ct)\n        {\n            try\n            {\n                using (var ctRegistration = ct.Register(() =>\n                {\n                    _mLContext?.CancelExecution();\n                }))\n                {\n                    return Task.FromResult(Run(settings));\n                }\n            }\n            catch (Exception ex) when (ct.IsCancellationRequested)\n            {\n                throw new OperationCanceledException(ex.Message, ex.InnerException);\n            }","sourceCodeStart":73,"sourceCodeEnd":109,"githubUrl":"https://github.com/dotnet/machinelearning/blob/7b76e69cf964daeca3f1377af6bc5543284d56c6/src/Microsoft.ML.AutoML/AutoMLExperiment/Runner/SweepablePipelineRunner.cs#L73-L109","documentation":"SweepablePipelineRunner.Run only knows how to evaluate pipelines when the IDatasetManager is an ITrainTestDatasetManager (single train/test split) or an ICrossValidationDatasetManager (CV folds). Any other IDatasetManager implementation falls through all branches and hits this ArgumentException. It signals an unsupported dataset manager type was plugged into the AutoML experiment.","triggerScenarios":"Registering a custom IDatasetManager (neither train-test nor cross-validation) in the AutoMLExperiment and running a trial; passing the wrong dataset manager type to SweepablePipelineRunner via RunAsync.","commonSituations":"Custom dataset-splitting strategies that don't implement one of the two supported interfaces; refactors that swapped the dataset manager type but kept an old runner; typo injecting an interface instead of a concrete implementation.","solutions":["Use ITrainTestDatasetManager or ICrossValidationDatasetManager as the experiment's dataset manager","If a custom strategy is needed, extend one of the two supported interfaces rather than inventing a new IDatasetManager","Add a Run branch in a derived runner for the custom manager type","Verify the registered service in AutoMLExperiment is the expected concrete type"],"exampleFix":"// before\nexperiment.SetDatasetManager(myCustomDatasetManager);\n// after\nvar trainTest = TrainTestDatasetManager.CreateTrainTestSplit(data, 0.8);\nexperiment.SetDatasetManager(trainTest); // or a cross-validation dataset manager","handlingStrategy":"type-guard","validationCode":"if (datasetManager is not ITrainTestDatasetManager && datasetManager is not ICrossValidationDatasetManager)\n    throw new InvalidOperationException(\"Register a supported dataset manager\");","typeGuard":"bool isSupported = datasetManager is ITrainTestDatasetManager or ICrossValidationDatasetManager;","tryCatchPattern":"try { await runner.RunAsync(settings, ct); }\ncatch (ArgumentException ex) when (ex.Message.Contains(\"IDatasetManager\")) { /* switch to supported manager */ }","preventionTips":["Only register ITrainTestDatasetManager or ICrossValidationDatasetManager","Add an interface-conformance check at experiment setup time","Review custom IDatasetManager implementations against the two supported contracts"],"tags":["dotnet","ml-automl","unsupported-type"],"backgroundTag":"unsupported-operation","analyzedSha":"7b76e69cf964daeca3f1377af6bc5543284d56c6","analyzedAt":"2026-09-11T12:35:38.930Z","contentChangedAt":"2026-09-11T12:35:38.930Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}