protected override Delegate[] CreatePredictionGetters(Booster xgboostModel, IRow input, Func <int, bool> predicate) { var active = Utils.BuildArray(OutputSchema.ColumnCount, predicate); xgboostModel.LazyInit(); var getters = new Delegate[1]; if (active[0]) { var featureGetter = RowCursorUtils.GetVecGetterAs <Float>(PrimitiveType.FromKind(DataKind.R4), input, InputSchema.Feature.Index); VBuffer <Float> features = default(VBuffer <Float>); var postProcessor = Parent.GetOutputPostProcessor(); VBuffer <Float> prediction = default(VBuffer <Float>); int expectedLength = input.Schema.GetColumnType(InputSchema.Feature.Index).VectorSize; var xgboostBuffer = Booster.CreateInternalBuffer(); ValueGetter <Float> localGetter = (ref Float value) => { featureGetter(ref features); Contracts.Assert(features.Length == expectedLength); xgboostModel.Predict(ref features, ref prediction, ref xgboostBuffer); value = prediction.Values[0]; postProcessor(ref value); }; getters[0] = localGetter; } return(getters); }
protected override Delegate[] CreatePredictionGetters(Booster xgboostModel, IRow input, Func <int, bool> predicate) { var active = Utils.BuildArray(OutputSchema.ColumnCount, predicate); xgboostModel.LazyInit(); var getters = new Delegate[1]; if (active[0]) { var featureGetter = RowCursorUtils.GetVecGetterAs <Float>(PrimitiveType.FromKind(DataKind.R4), input, InputSchema.Feature.Index); VBuffer <Float> features = new VBuffer <Float>(); var postProcessor = Parent.GetOutputPostProcessor(); int expectedLength = input.Schema.GetColumnType(InputSchema.Feature.Index).VectorSize; var xgboostBuffer = Booster.CreateInternalBuffer(); int nbMappedClasses = _classMapping == null ? 0 : _numberOfClasses; if (nbMappedClasses == 0) { ValueGetter <VBuffer <Float> > localGetter = (ref VBuffer <Float> prediction) => { featureGetter(ref features); Contracts.Assert(features.Length == expectedLength); xgboostModel.Predict(ref features, ref prediction, ref xgboostBuffer); postProcessor(ref prediction); }; getters[0] = localGetter; } else { ValueGetter <VBuffer <Float> > localGetter = (ref VBuffer <Float> prediction) => { featureGetter(ref features); Contracts.Assert(features.Length == expectedLength); xgboostModel.Predict(ref features, ref prediction, ref xgboostBuffer); Contracts.Assert(prediction.IsDense); postProcessor(ref prediction); var indices = prediction.Indices; if (indices == null || indices.Length < _classMapping.Length) { indices = new int[_classMapping.Length]; } Array.Copy(_classMapping, indices, _classMapping.Length); prediction = new VBuffer <float>(nbMappedClasses, _classMapping.Length, prediction.Values, indices); }; getters[0] = localGetter; } } return(getters); }