public SlotCursor(NAReplaceTransform parent, int iinfo, ISlotCursor cursor, VectorType type) : base(parent.Host, cursor) { Ch.Assert(0 <= iinfo && iinfo < parent.Infos.Length); Ch.AssertValue(cursor); Ch.AssertValue(type); var srcGetter = cursor.GetGetter <T>(); _type = type; _getter = CreateGetter(parent, iinfo, cursor, type); }
private void InitVec <T>(int col) { var type = Schema.GetColumnType(col); Ch.Assert(type.IsVector); Ch.Assert(typeof(T) == type.ItemType.RawType); var trans = _parent.EnsureAndGetTransposer(col); ISlotCursor cursor = trans.GetSlotCursor(0); ValueGetter <VBuffer <T> > getter = cursor.GetGetter <T>(); int i = _colToActivesIndex[col]; _getters[i] = getter; _transCursors[i] = cursor; }
public static ValueGetter <VBuffer <Single> > GetLabelGetter(ISlotCursor cursor) { var type = cursor.GetSlotType().ItemType; if (type == NumberType.R4) { return(cursor.GetGetter <Single>()); } if (type == NumberType.R8 || type.IsBool) { return(GetVecGetterAs <Single>(NumberType.R4, cursor)); } Contracts.Check(type.IsKey, "Only floating point number, boolean, and key type values can be used as label."); Contracts.Assert(TestGetLabelGetter(type) == null); ulong keyMax = (ulong)type.KeyCount; if (keyMax == 0) { keyMax = ulong.MaxValue; } var getSrc = RowCursorUtils.GetVecGetterAs <ulong>(NumberType.U8, cursor); VBuffer <ulong> src = default(VBuffer <ulong>); return ((ref VBuffer <Single> dst) => { getSrc(ref src); // Unfortunately defaults in one to not translate to defaults of the other, // so this will not be sparsity preserving. Assume a dense output. Single[] vals = dst.Values; Utils.EnsureSize(ref vals, src.Length); foreach (var kv in src.Items(all: true)) { if (0 < kv.Value && kv.Value <= keyMax) { vals[kv.Key] = kv.Value - 1; } else { vals[kv.Key] = Single.NaN; } } dst = new VBuffer <Single>(src.Length, vals, dst.Indices); }); }
private void InitOne <T>(int col) { var type = Schema.GetColumnType(col); Ch.Assert(typeof(T) == type.RawType); var trans = _parent.EnsureAndGetTransposer(col); ISlotCursor cursor = trans.GetSlotCursor(0); ValueGetter <VBuffer <T> > getter = cursor.GetGetter <T>(); VBuffer <T> buff = default(VBuffer <T>); ValueGetter <T> oneGetter = (ref T value) => { getter(ref buff); Ch.Assert(buff.Length == 1); buff.GetItemOrDefault(0, ref value); }; int i = _colToActivesIndex[col]; _getters[i] = oneGetter; _transCursors[i] = cursor; }
private ValueGetter <VBuffer <T> > CreateGetter(NAReplaceTransform parent, int iinfo, ISlotCursor cursor, VectorType type) { var src = default(VBuffer <T>); ValueGetter <VBuffer <T> > getter; var getSrc = cursor.GetGetter <T>(); var isNA = (RefPredicate <T>)parent._isNAs[iinfo]; var isDefault = Conversions.Instance.GetIsDefaultPredicate <T>(type.ItemType); if (parent._repIsDefault[iinfo] == null) { // One replacement value for all slots. Ch.Assert(parent._repValues[iinfo] is T); T rep = (T)parent._repValues[iinfo]; bool repIsDefault = isDefault(ref rep); return((ref VBuffer <T> dst) => { getSrc(ref src); parent.FillValues(ref src, ref dst, isNA, rep, repIsDefault); }); } // Replacement values by slot. Ch.Assert(parent._repValues[iinfo] is T[]); // The replacement array. T[] repArray = (T[])parent._repValues[iinfo]; return(getter = (ref VBuffer <T> dst) => { getSrc(ref src); Ch.Check(0 <= Position && Position < repArray.Length); T rep = repArray[(int)Position]; parent.FillValues(ref src, ref dst, isNA, rep, isDefault(ref rep)); }); }