public SynchronizedSlotCursor(IChannelProvider provider, SlotCursor cursor) : base(provider) { Contracts.AssertValue(cursor); // If the input is itself a sync-base, we can walk up the chain to get its root, // thereby making things more efficient. _root = cursor is SynchronizedSlotCursor sync ? sync._root : cursor; }
public static ValueGetter <VBuffer <Single> > GetLabelGetter(SlotCursor 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. var editor = VBufferEditor.Create(ref dst, src.Length); foreach (var kv in src.Items(all: true)) { if (0 < kv.Value && kv.Value <= keyMax) { editor.Values[kv.Key] = kv.Value - 1; } else { editor.Values[kv.Key] = Single.NaN; } } dst = editor.Commit(); }); }
public SlotImpl(SlotCursor cursor) { _cursor = cursor; }
public static GetterFactory Create(SlotCursor cursor) { return(new SlotImpl(cursor)); }
/// <summary> /// Given the item type, typeDst, and a slot cursor, return a ValueGetter{VBuffer{TDst}} for the /// vector-valued column with a conversion to a vector of typeDst, if needed. /// </summary> public static ValueGetter <VBuffer <TDst> > GetVecGetterAs <TDst>(PrimitiveType typeDst, SlotCursor cursor) { Contracts.CheckValue(typeDst, nameof(typeDst)); Contracts.CheckParam(typeDst.RawType == typeof(TDst), nameof(typeDst)); var typeSrc = cursor.GetSlotType(); Func <VectorType, PrimitiveType, GetterFactory, ValueGetter <VBuffer <TDst> > > del = GetVecGetterAsCore <int, TDst>; var methodInfo = del.GetMethodInfo().GetGenericMethodDefinition().MakeGenericMethod(typeSrc.ItemType.RawType, typeof(TDst)); return((ValueGetter <VBuffer <TDst> >)methodInfo.Invoke(null, new object[] { typeSrc, typeDst, GetterFactory.Create(cursor) })); }