Beispiel #1
0
                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;
                }
Beispiel #2
0
            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.");
            }
Beispiel #3
0
        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);
                }
            }
        }