public ValueMapper <TIn, TOut> GetMapper <TIn, TOut>() { Host.Check(typeof(TIn) == typeof(VBuffer <Single>)); Host.Check(typeof(TOut) == typeof(VBuffer <Single>)); var combine = Combiner.GetCombiner(); var features = new VBuffer <Single> [_mappers.Length]; var predictions = new VBuffer <Single> [_mappers.Length]; var maps = new ValueMapper <VBuffer <Single>, VBuffer <Single> > [_mappers.Length]; for (int i = 0; i < _mappers.Length; i++) { // IsValid method ensures we go this else path only if the OutputType.VectorSize of // all _mappers is greater than zero Host.Assert(_mappers[i].OutputType.VectorSize > 0); maps[i] = _mappers[i].GetMapper <VBuffer <Single>, VBuffer <Single> >(); } ValueMapper <VBuffer <Single>, VBuffer <Single> > del = (ref VBuffer <Single> src, ref VBuffer <Single> dst) => { if (_inputType.VectorSize > 0) { Host.Check(src.Length == _inputType.VectorSize); } var tmp = src; Parallel.For(0, maps.Length, i => { var model = Models[i]; if (model.SelectedFeatures != null) { EnsembleUtils.SelectFeatures(ref tmp, model.SelectedFeatures, model.Cardinality, ref features[i]); maps[i](ref features[i], ref predictions[i]); } else { maps[i](ref tmp, ref predictions[i]); } // individual maps delegates will return always the same VBuffer length Host.Check(predictions[i].Length == _mappers[i].OutputType.VectorSize); }); combine(ref dst, predictions, Weights); }; return((ValueMapper <TIn, TOut>)(Delegate) del); }
public ValueMapper <TIn, TOut> GetMapper <TIn, TOut>() { Host.Check(typeof(TIn) == typeof(VBuffer <Single>)); Host.Check(typeof(TOut) == typeof(Single)); var combine = Combiner.GetCombiner(); var predictions = new Single[_mappers.Length]; var buffers = new VBuffer <Single> [_mappers.Length]; var maps = new ValueMapper <VBuffer <Single>, Single> [_mappers.Length]; for (int i = 0; i < _mappers.Length; i++) { maps[i] = _mappers[i].GetMapper <VBuffer <Single>, Single>(); } ValueMapper <VBuffer <Single>, Single> del = (ref VBuffer <Single> src, ref Single dst) => { if (InputType.VectorSize > 0) { Host.Check(src.Length == InputType.VectorSize); } var tmp = src; Parallel.For(0, maps.Length, i => { var model = Models[i]; if (model.SelectedFeatures != null) { EnsembleUtils.SelectFeatures(ref tmp, model.SelectedFeatures, model.Cardinality, ref buffers[i]); maps[i](ref buffers[i], ref predictions[i]); } else { maps[i](ref tmp, ref predictions[i]); } }); combine(ref dst, predictions, Weights); }; return((ValueMapper <TIn, TOut>)(Delegate) del); }
public ValueMapper <TIn, TOut, TDist> GetMapper <TIn, TOut, TDist>() { Host.Check(typeof(TIn) == typeof(VBuffer <Single>)); Host.Check(typeof(TOut) == typeof(Single)); Host.Check(typeof(TDist) == typeof(Single)); var combine = Combiner.GetCombiner(); var combineProb = _probabilityCombiner.GetCombiner(); var maps = GetMaps(); var predictions = new Single[_mappers.Length]; var probabilities = new Single[_mappers.Length]; var vBuffers = new VBuffer <Single> [_mappers.Length]; ValueMapper <VBuffer <Single>, Single, Single> del = (ref VBuffer <Single> src, ref Single score, ref Single prob) => { if (InputType.VectorSize > 0) { Host.Check(src.Length == InputType.VectorSize); } var tmp = src; Parallel.For(0, maps.Length, i => { var model = Models[i]; if (model.SelectedFeatures != null) { EnsembleUtils.SelectFeatures(ref tmp, model.SelectedFeatures, model.Cardinality, ref vBuffers[i]); maps[i](ref vBuffers[i], ref predictions[i], ref probabilities[i]); } else { maps[i](ref tmp, ref predictions[i], ref probabilities[i]); } }); combine(ref score, predictions, _averagedWeights); combineProb(ref prob, probabilities, _averagedWeights); }; return((ValueMapper <TIn, TOut, TDist>)(Delegate) del); }
public ValueMapper <TIn, TOut> GetMapper <TIn, TOut>() { Host.Check(typeof(TIn) == typeof(VBuffer <Single>)); Host.Check(typeof(TOut) == typeof(Single)); var combine = Combiner.GetCombiner(); var maps = GetMaps(); var predictions = new Single[_mappers.Length]; var probabilities = new Single[_mappers.Length]; var vBuffers = new VBuffer <Single> [_mappers.Length]; ValueMapper <VBuffer <Single>, Single> del = (ref VBuffer <Single> src, ref Single dst) => { if (InputType.VectorSize > 0) { Host.Check(src.Length == InputType.VectorSize); } var tmp = src; Parallel.For(0, maps.Length, i => { var model = Models[i]; if (model.SelectedFeatures != null) { EnsembleUtils.SelectFeatures(ref tmp, model.SelectedFeatures, model.Cardinality, ref vBuffers[i]); maps[i](ref vBuffers[i], ref predictions[i], ref probabilities[i]); } else { maps[i](ref tmp, ref predictions[i], ref probabilities[i]); } }); // REVIEW: DistributionEnsemble - AveragedWeights are used only in one of the two PredictDistributions overloads combine(ref dst, predictions, Weights); }; return((ValueMapper <TIn, TOut>)(Delegate) del); }