private Delegate MakeGetter(IChannel ch, IRow input, int iinfo, FinderDecorator decorator = null) { ch.Assert(_bindings.Infos[iinfo].SrcTypes.All(t => t.IsVector && t.ItemType.IsKey)); var info = _bindings.Infos[iinfo]; int srcCount = info.SrcIndices.Length; ValueGetter <VBuffer <uint> >[] getSrc = new ValueGetter <VBuffer <uint> > [srcCount]; for (int isrc = 0; isrc < srcCount; isrc++) { getSrc[isrc] = RowCursorUtils.GetVecGetterAs <uint>(NumberType.U4, input, info.SrcIndices[isrc]); } var src = default(VBuffer <uint>); var ngramIdFinder = GetNgramIdFinder(iinfo); if (decorator != null) { ngramIdFinder = decorator(iinfo, ngramIdFinder); } var bldr = new NgramBufferBuilder(_exes[iinfo].NgramLength, _exes[iinfo].SkipLength, _bindings.Types[iinfo].ValueCount, ngramIdFinder); var keyCounts = _bindings.Infos[iinfo].SrcTypes.Select( t => t.ItemType.KeyCount > 0 ? (uint)t.ItemType.KeyCount : uint.MaxValue).ToArray(); // REVIEW: Special casing the srcCount==1 case could potentially improve perf. ValueGetter <VBuffer <Float> > del = (ref VBuffer <Float> dst) => { bldr.Reset(); for (int i = 0; i < srcCount; i++) { getSrc[i](ref src); bldr.AddNgrams(in src, i, keyCounts[i]);
public RowCursor(NgramHashTransform parent, IRowCursor input, bool[] active, FinderDecorator decorator = null) : base(parent.Host, input) { Ch.AssertValue(parent); Ch.Assert(active == null || active.Length == parent._bindings.ColumnCount); Ch.AssertValueOrNull(decorator); _bindings = parent._bindings; _active = active; _getters = new Delegate[_bindings.Infos.Length]; for (int iinfo = 0; iinfo < _bindings.Infos.Length; iinfo++) { if (IsIndexActive(iinfo)) { _getters[iinfo] = parent.MakeGetter(Ch, Input, iinfo, decorator); } } }