public CsrFiller(DataViewRow input, int idvColIndex, DataViewType type, DataAppender <TSrc> dataAppender, CsrData csrData) : base() { Contracts.AssertValue(input); Contracts.Assert(0 <= idvColIndex && idvColIndex < input.Schema.Count); if (type is VectorDataViewType) { _getVec = RowCursorUtils.GetVecGetterAs <TSrc>((PrimitiveDataViewType)type.GetItemType(), input, idvColIndex); } else { _get = RowCursorUtils.GetGetterAs <TSrc>(type, input, idvColIndex); } _csrData = csrData; _dataAppender = dataAppender; }
public static CsrFillerBase Create(EnvironmentBlock *penv, DataViewRow input, int idvCol, DataViewType idvColType, InternalDataKind outputDataKind, CsrData csrData) { if (outputDataKind == InternalDataKind.R4) { switch (idvColType.GetItemType().GetRawKind()) { case InternalDataKind.I1: DataAppender <sbyte> appendI1 = (sbyte val, int i) => csrData.AppendR4((float)val, i); return(new CsrFiller <sbyte>(input, idvCol, idvColType, appendI1, csrData)); case InternalDataKind.I2: DataAppender <short> appendI2 = (short val, int i) => csrData.AppendR4((float)val, i); return(new CsrFiller <short>(input, idvCol, idvColType, appendI2, csrData)); case InternalDataKind.U1: DataAppender <byte> appendU1 = (byte val, int i) => csrData.AppendR4((float)val, i); return(new CsrFiller <byte>(input, idvCol, idvColType, appendU1, csrData)); case InternalDataKind.U2: DataAppender <ushort> appendU2 = (ushort val, int i) => csrData.AppendR4((float)val, i); return(new CsrFiller <ushort>(input, idvCol, idvColType, appendU2, csrData)); case InternalDataKind.R4: DataAppender <float> appendR4 = (float val, int i) => csrData.AppendR4((float)val, i); return(new CsrFiller <float>(input, idvCol, idvColType, appendR4, csrData)); default: throw Contracts.Except("Source data type not supported"); } } else if (outputDataKind == InternalDataKind.R8) { switch (idvColType.GetItemType().GetRawKind()) { case InternalDataKind.I1: DataAppender <sbyte> appendI1 = (sbyte val, int i) => csrData.AppendR8((double)val, i); return(new CsrFiller <sbyte>(input, idvCol, idvColType, appendI1, csrData)); case InternalDataKind.I2: DataAppender <short> appendI2 = (short val, int i) => csrData.AppendR8((double)val, i); return(new CsrFiller <short>(input, idvCol, idvColType, appendI2, csrData)); case InternalDataKind.I4: DataAppender <int> appendI4 = (int val, int i) => csrData.AppendR8((double)val, i); return(new CsrFiller <int>(input, idvCol, idvColType, appendI4, csrData)); case InternalDataKind.U1: DataAppender <byte> appendU1 = (byte val, int i) => csrData.AppendR8((double)val, i); return(new CsrFiller <byte>(input, idvCol, idvColType, appendU1, csrData)); case InternalDataKind.U2: DataAppender <ushort> appendU2 = (ushort val, int i) => csrData.AppendR8((double)val, i); return(new CsrFiller <ushort>(input, idvCol, idvColType, appendU2, csrData)); case InternalDataKind.U4: DataAppender <uint> appendU4 = (uint val, int i) => csrData.AppendR8((double)val, i); return(new CsrFiller <uint>(input, idvCol, idvColType, appendU4, csrData)); case InternalDataKind.R4: DataAppender <float> appendR4 = (float val, int i) => csrData.AppendR8((double)val, i); return(new CsrFiller <float>(input, idvCol, idvColType, appendR4, csrData)); case InternalDataKind.R8: DataAppender <double> appendR8 = (double val, int i) => csrData.AppendR8((double)val, i); return(new CsrFiller <double>(input, idvCol, idvColType, appendR8, csrData)); default: throw Contracts.Except("Source data type not supported"); } } throw Contracts.Except("Target data type not supported."); }
private static unsafe void SendViewToNativeAsCsr(IChannel ch, EnvironmentBlock *penv, IDataView view) { Contracts.AssertValue(ch); Contracts.Assert(penv != null); Contracts.AssertValue(view); if (penv->dataSink == null) { // Environment doesn't want any data! return; } var dataSink = MarshalDelegate <DataSink>(penv->dataSink); var schema = view.Schema; var colIndices = new List <int>(); var outputDataKind = InternalDataKind.R4; int numOutputRows = 0; int numOutputCols = 0; for (int col = 0; col < schema.Count; col++) { if (schema[col].IsHidden) { continue; } var fullType = schema[col].Type; var itemType = fullType.GetItemType(); int valueCount = fullType.GetValueCount(); if (valueCount == 0) { throw ch.ExceptNotSupp("Column has variable length vector: " + schema[col].Name + ". Not supported in python. Drop column before sending to Python"); } if (itemType.IsStandardScalar()) { switch (itemType.GetRawKind()) { default: throw Contracts.Except("Data type {0} not supported", itemType.GetRawKind()); case InternalDataKind.I1: case InternalDataKind.I2: case InternalDataKind.U1: case InternalDataKind.U2: case InternalDataKind.R4: break; case InternalDataKind.I4: case InternalDataKind.U4: case InternalDataKind.R8: outputDataKind = InternalDataKind.R8; break; } } else { throw Contracts.Except("Data type {0} not supported", itemType.GetRawKind()); } colIndices.Add(col); numOutputCols += valueCount; } var allNames = new HashSet <string>(); var nameIndices = new List <int>(); var nameUtf8Bytes = new List <Byte>(); AddUniqueName("data", allNames, nameIndices, nameUtf8Bytes); AddUniqueName("indices", allNames, nameIndices, nameUtf8Bytes); AddUniqueName("indptr", allNames, nameIndices, nameUtf8Bytes); AddUniqueName("shape", allNames, nameIndices, nameUtf8Bytes); var kindList = new List <InternalDataKind> { outputDataKind, InternalDataKind.I4, InternalDataKind.I4, InternalDataKind.I4 }; var kinds = kindList.ToArray(); var nameBytes = nameUtf8Bytes.ToArray(); var names = new byte *[allNames.Count]; fixed(InternalDataKind *prgkind = kinds) fixed(byte *prgbNames = nameBytes) fixed(byte **prgname = names) { for (int iid = 0; iid < names.Length; iid++) { names[iid] = prgbNames + nameIndices[iid]; } DataViewBlock block; block.ccol = allNames.Count; block.crow = view.GetRowCount() ?? 0; block.names = (sbyte **)prgname; block.kinds = prgkind; block.keyCards = null; dataSink(penv, &block, out var setters, out var keyValueSetter); if (setters == null) { return; } using (var cursor = view.GetRowCursor(view.Schema.Where(col => colIndices.Contains(col.Index)))) { CsrData csrData = new CsrData(penv, setters, outputDataKind); var fillers = new CsrFillerBase[colIndices.Count]; for (int i = 0; i < colIndices.Count; i++) { var type = schema[colIndices[i]].Type; fillers[i] = CsrFillerBase.Create(penv, cursor, colIndices[i], type, outputDataKind, csrData); } for (;; numOutputRows++) { if (!cursor.MoveNext()) { break; } for (int i = 0; i < fillers.Length; i++) { fillers[i].Set(); } csrData.IncrementRow(); } csrData.SetShape(numOutputRows, numOutputCols); } } }