protected virtual IDataTransform Create(IHostEnvironment env, Arguments args, IDataView input, out IDataView sourceCtx, IPredictor overwritePredictor) { sourceCtx = input; Contracts.CheckValue(env, "env"); env.CheckValue(args, "args"); env.CheckValue(input, "input"); IPredictor predictor; if (overwritePredictor == null) { throw env.Except("No defined predictor."); } else { predictor = overwritePredictor; } // The function is returning something and modifying a member of the class. Not very fancy. _predictor = predictor; string feat = TrainUtils.MatchNameOrDefaultOrNull(env, input.Schema, "featureColumn", args.featureColumn, DefaultColumnNames.Features); int index = SchemaHelper.GetColumnIndex(input.Schema, feat); var type = input.Schema[index].Type; if (!type.IsVector() || type.AsVector().ItemType().RawKind() != DataKind.R4) { throw env.Except("Features must a vector of floats"); } if (args.useProb) { var valueMapper = predictor as IValueMapperDist; if (valueMapper == null) { throw env.Except("Predictor must be a IValueMapper."); } var output = valueMapper.DistType; if (output.IsVector()) { return(CreateTransformValueMapperDist <VBuffer <float>, VBuffer <float>, VBuffer <float> >(valueMapper, feat, args.outputColumn)); } else { return(CreateTransformValueMapperDist <VBuffer <float>, VBuffer <float>, float>(valueMapper, feat, args.outputColumn)); } } else { var valueMapper = predictor as IValueMapper; if (valueMapper == null) { throw env.Except("Predictor must be a IValueMapper."); } var output = valueMapper.OutputType; if (output.IsVector()) { return(CreateTransformValueMapper <VBuffer <float>, VBuffer <float> >(valueMapper, feat, args.outputColumn)); } else { return(CreateTransformValueMapper <VBuffer <float>, float>(valueMapper, feat, args.outputColumn)); } } }