예제 #1
0
        //Similar code above but doesn't pad out a variable's line until it needs to

        /// <summary>
        /// Create a DenseStructMatrix from a sequences of RowKeyColKeyValue triples.
        /// </summary>
        /// <param name="tripleEnumerable">The squences of RowKeyColKeyValue triples</param>
        public void GetInstanceFromSparseInternal(IEnumerable <RowKeyColKeyValue <string, string, TValue> > tripleEnumerable)
        {
            ColSerialNumbers  = new SerialNumbers <string>();
            RowKeyToStoreList = new Dictionary <string, List <TStore> >();

            foreach (var triple in tripleEnumerable)
            {
                string        rowKey = triple.RowKey;
                List <TStore> storeList;
                if (!RowKeyToStoreList.TryGetValue(rowKey, out storeList))
                {
                    storeList = Enumerable.Repeat(StoreMissingValue, ColSerialNumbers.Count).ToList();
                    RowKeyToStoreList[rowKey] = storeList;
                }

                string colKey = triple.ColKey;
                TValue value  = triple.Value;
                TStore store  = ValueToStore(value);
                Helper.CheckCondition(!store.Equals(StoreMissingValue), "Vals cannot covert to '" + StoreMissingValue.ToString() + "'");

                int colIndex = ColSerialNumbers.GetNewOrOld(colKey);
                if (colIndex < storeList.Count)
                {
                    storeList[colIndex] = store;
                }
                else
                {
                    while (colIndex > storeList.Count)
                    {
                        storeList.Add(StoreMissingValue);
                    }
                    Helper.CheckCondition(colIndex == storeList.Count, "real assert");
                    storeList.Add(store);
                }
            }

            foreach (var storeList in RowKeyToStoreList.Values)
            {
                storeList.TrimExcess();
            }

            _rowKeys       = RowKeyToStoreList.Keys.ToList();
            _indexOfRowKey = RowKeys.Select((key, index) => new { key, index }).ToDictionary(keyAndIndex => keyAndIndex.key, keyAndIndex => keyAndIndex.index);
        }
예제 #2
0
        internal void GetInstanceFromSparseInternal(string inputSparsePattern)
        {
            ColSerialNumbers  = new SerialNumbers <string>();
            RowKeyToStoreList = new Dictionary <string, List <TStore> >();

            //!!!05/18/2009 optimize could be made faster with plinq using an index read to keep the order of the rowKeys (aka vars)
            foreach (List <string[]> linesWithSameRowKey in SparseGroupedByVar(inputSparsePattern, /*zeroIsOK*/ false, "File {0}"))
            {
                Debug.Assert(linesWithSameRowKey.Count > 0); // real assert
                string rowKey = linesWithSameRowKey[0][0];

                List <TStore> storeList = Enumerable.Repeat(StoreMissingValue, ColSerialNumbers.Count).ToList();
                RowKeyToStoreList.Add(rowKey, storeList);

                foreach (string[] rowKeyColKeyVal in linesWithSameRowKey)
                {
                    string colKey      = rowKeyColKeyVal[1];
                    string valAsString = rowKeyColKeyVal[2];
                    TStore store       = SparseValToStore(valAsString);
                    Helper.CheckCondition(!store.Equals(StoreMissingValue), "Vals cannot covert to '" + StoreMissingValue.ToString() + "'"); //OK to use Equals because TScore can't be null

                    int colIndex = ColSerialNumbers.GetNewOrOld(colKey);
                    if (colIndex < storeList.Count)
                    {
                        storeList[colIndex] = store;
                    }
                    else
                    {
                        Helper.CheckCondition(colIndex == storeList.Count, "the input data should be grouped by var");
                        storeList.Add(store);
                    }
                }
                storeList.TrimExcess();
            }

            _rowKeys       = RowKeyToStoreList.Keys.ToList();
            _indexOfRowKey = RowKeys.Select((key, index) => new { key, index }).ToDictionary(keyAndIndex => keyAndIndex.key, keyAndIndex => keyAndIndex.index);
        }