/// <summary>
        /// Gets aggregated version of the objects
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="source">The source.</param>
        /// <param name="type">The type.</param>
        /// <returns></returns>
        public static collectionAggregationResult <T> GetAggregates <T>(this IEnumerable <T> source, dataPointAggregationType type = dataPointAggregationType.avg, bool stringKeepLastEntry = true) where T : class, new()
        {
            //if (type == dataPointAggregationType.none)
            //{
            //}

            var aggList = type.getEnumListFromFlags <dataPointAggregationType>();

            collectionAggregationResult <T> output = new collectionAggregationResult <T>();

            output.aspect = dataPointAggregationAspect.subSetOfRows;

            aceDictionary2D <dataPointAggregationType, PropertyInfo, double> outputData = new aceDictionary2D <dataPointAggregationType, PropertyInfo, double>();

            aceDictionary2D <dataPointAggregationType, PropertyInfo, List <double> > datatCollections = new aceDictionary2D <dataPointAggregationType, PropertyInfo, List <double> >();

            Type t = typeof(T);

            List <PropertyInfo> nominalList = new List <PropertyInfo>();
            List <PropertyInfo> piList      = new List <PropertyInfo>();

            Dictionary <PropertyInfo, settingsPropertyEntry> sPEDict = new Dictionary <PropertyInfo, settingsPropertyEntry>();

            foreach (PropertyInfo pi in t.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty | BindingFlags.GetProperty))
            {
                settingsPropertyEntry sPE = new settingsPropertyEntry(pi);

                bool ok = true;

                if (!pi.CanWrite)
                {
                    ok = false;
                }

                if (ok && pi.PropertyType == typeof(string))
                {
                    nominalList.Add(pi);
                    ok = false;
                }
                else if (ok && pi.PropertyType == typeof(Enum))
                {
                    ok = false;
                }

                if (ok && sPE.aggregation[dataPointAggregationAspect.subSetOfRows].HasFlag(dataPointAggregationType.hidden))
                {
                    ok = false;
                }
                if (ok && sPE.attributes.ContainsKey(imbAttributeName.reporting_hide))
                {
                    ok = false;
                }

                if (ok)
                {
                    sPEDict.Add(pi, sPE);
                    piList.Add(pi);
                }
            }

            if (aggList.Contains(dataPointAggregationType.avg))
            {
                aggList.AddUnique(dataPointAggregationType.sum);
            }

            if (aggList.Contains(dataPointAggregationType.range))
            {
                aggList.AddUnique(dataPointAggregationType.min);
                aggList.AddUnique(dataPointAggregationType.max);
            }

            foreach (dataPointAggregationType aggType in aggList)
            {
                output.Add(aggType, new T());

                switch (aggType)
                {
                case dataPointAggregationType.var:
                case dataPointAggregationType.stdev:
                case dataPointAggregationType.entropy:
                    foreach (PropertyInfo pi in piList)
                    {
                        datatCollections[aggType, pi] = new List <double>();    //.Add(item.imbGetPropertySafe<Double>(pi));
                    }
                    break;
                }

                // outputData.Add(aggType, 0);
            }

            int count = 0;

            // <------------ first pass
            foreach (T item in source)
            {
                if (output.firstItem == null)
                {
                    output.firstItem = item;
                }
                output.lastItem = item;
                foreach (dataPointAggregationType aggType in aggList)
                {
                    foreach (PropertyInfo pi in piList)
                    {
                        double vl = outputData[aggType, pi];

                        switch (aggType)
                        {
                        case dataPointAggregationType.sum:
                            vl = vl + item.imbGetPropertySafe <double>(pi);
                            break;

                        case dataPointAggregationType.min:
                            vl = Math.Min(item.imbGetPropertySafe <double>(pi), vl);
                            break;

                        case dataPointAggregationType.max:
                            vl = Math.Max(item.imbGetPropertySafe <double>(pi), vl);
                            break;

                        case dataPointAggregationType.var:
                        case dataPointAggregationType.stdev:
                        case dataPointAggregationType.entropy:
                            datatCollections[aggType, pi].Add(item.imbGetPropertySafe <double>(pi));
                            break;
                        }
                        outputData[aggType, pi] = vl;
                    }
                }

                count++;
            }

            foreach (dataPointAggregationType aggType in aggList)
            {
                foreach (PropertyInfo pi in piList)
                {
                    switch (aggType)
                    {
                    case dataPointAggregationType.count:
                        outputData[aggType, pi] = count;
                        break;

                    case dataPointAggregationType.avg:
                        outputData[aggType, pi] = outputData[dataPointAggregationType.sum, pi] / (double)count;
                        break;

                    case dataPointAggregationType.range:
                        outputData[aggType, pi] = outputData[dataPointAggregationType.max, pi] - outputData[dataPointAggregationType.min, pi];
                        break;

                    case dataPointAggregationType.firstEntry:
                        outputData[aggType, pi] = output.firstItem.imbGetPropertySafe <double>(pi);
                        break;

                    case dataPointAggregationType.lastEntry:
                        outputData[aggType, pi] = output.lastItem.imbGetPropertySafe <double>(pi);
                        break;

                    case dataPointAggregationType.var:
                        outputData[aggType, pi] = datatCollections[aggType, pi].GetVariance();
                        break;

                    case dataPointAggregationType.stdev:
                        outputData[aggType, pi] = datatCollections[aggType, pi].GetStdDeviation();
                        break;

                    case dataPointAggregationType.entropy:
                        outputData[aggType, pi] = datatCollections[aggType, pi].GetEntropy();
                        break;
                    }
                }
            }

            foreach (dataPointAggregationType aggType in aggList)
            {
                foreach (PropertyInfo pi in piList)
                {
                    output[aggType].imbSetPropertyConvertSafe(pi, outputData[aggType, pi]);
                }

                if (stringKeepLastEntry)
                {
                    foreach (PropertyInfo pi in nominalList)
                    {
                        output[aggType].imbSetPropertyConvertSafe(pi, output.lastItem.imbGetPropertySafe(pi));
                    }
                }
            }
            output.Count = count;
            return(output);
        }
        public static DataTable GetParallelAggregates <T>(this List <IEnumerable <T> > sources, string column_snap, string column_prefix, dataPointAggregationType column_sideAggregates, params string[] column_toInclude)
        {
            settingsEntriesForObject sEO        = new settingsEntriesForObject(typeof(T));
            settingsPropertyEntry    sPE_snap   = sEO.spes[column_snap];
            settingsPropertyEntry    sPE_prefix = sEO.spes[column_prefix];

            List <settingsPropertyEntry> sPE_toInclude = new List <settingsPropertyEntry>();

            foreach (string toInclude in column_toInclude)
            {
                sPE_toInclude.Add(sEO.spes[toInclude]);
            }

            List <dataPointAggregationType> side_aggregates = column_sideAggregates.getEnumListFromFlags <dataPointAggregationType>();

            Dictionary <dataPointAggregationType, settingsPropertyEntry> sPE_sideAggregates = new Dictionary <dataPointAggregationType, settingsPropertyEntry>();

            Dictionary <settingsPropertyEntry, dataPointAggregationType> sPE_sideAggregatesContra = new Dictionary <settingsPropertyEntry, dataPointAggregationType>();

            foreach (settingsPropertyEntry toInclude in sPE_toInclude)
            {
                foreach (dataPointAggregationType sideType in side_aggregates)
                {
                    settingsPropertyEntry sPE = new settingsPropertyEntry(toInclude.pi);
                    sPE.type = typeof(double);
                    sPE.name = sPE.name + "_" + sideType.ToString();
                    sPE_sideAggregates.Add(sideType, sPE);
                    sPE_sideAggregatesContra.Add(sPE, sideType);
                }
            }

            // <---------------------------- preparing data

            Dictionary <string, IEnumerable <T> > dataByPrefix = new Dictionary <string, IEnumerable <T> >();
            int c = 0;

            foreach (IEnumerable <T> s in sources)
            {
                T firstItem = s.FirstOrDefault <T>();
                if (firstItem != null)
                {
                    string prefix = firstItem.imbGetPropertySafe(sPE_prefix.pi).toStringSafe(c.ToString("D3"));
                    dataByPrefix.Add(prefix, s);
                }
                c++;
            }

            // <----- DataColumn Index

            aceDictionarySet <string, DataColumn> columnsByPrefix = new aceDictionarySet <string, DataColumn>();

            aceDictionarySet <string, DataColumn> columnsSideAggregationByPrefix = new aceDictionarySet <string, DataColumn>();

            // <------------------------- building Shema
            DataTable output = new DataTable();

            output.TableName = "ParallelAggregate_by_" + column_snap;

            DataColumn            col_recordID = output.Add("ID", "Row ordinal number", "ID", typeof(int), dataPointImportance.normal, "D3").SetUnit("#");
            settingsPropertyEntry sPE_recID    = col_recordID.GetSPE();

            DataColumn col_snap = output.Add(sPE_snap);

            aceDictionary2D <settingsPropertyEntry, dataPointAggregationType, DataColumn> columnsByAggregationType = new aceDictionary2D <settingsPropertyEntry, dataPointAggregationType, DataColumn>();
            aceDictionarySet <settingsPropertyEntry, DataColumn> columnsBySource = new aceDictionarySet <settingsPropertyEntry, DataColumn>();

            foreach (settingsPropertyEntry toInclude in sPE_toInclude)
            {
                foreach (var pair in dataByPrefix)
                {
                    DataColumn nColumn = output.Add(toInclude);
                    nColumn.ColumnName = pair.Key + "_" + nColumn.ColumnName;
                    nColumn.SetGroup(pair.Key);

                    columnsByPrefix.Add(pair.Key, nColumn);

                    columnsBySource.Add(toInclude, nColumn);
                }

                foreach (var pair2 in sPE_sideAggregatesContra)
                {
                    DataColumn nColumn2 = output.Add(toInclude);
                    nColumn2.SetGroup("Aggregate");

                    //                    columnsSideAggregationByPrefix.Add(pair.Key, nColumn);
                }
            }

            // <----------------------------------------------------------- collecting rows

            aceDictionary2D <string, settingsPropertyEntry, object> dataRowBySnapValue = new aceDictionary2D <string, settingsPropertyEntry, object>();

            int riMax = 0;

            foreach (string prefix in dataByPrefix.Keys)
            {
                IEnumerable <T> s  = dataByPrefix[prefix];
                int             ri = 0;
                foreach (T si in s)
                {
                    ri++;
                    string snapValue = si.imbGetPropertySafe(sPE_snap.pi).toStringSafe();

                    dataRowBySnapValue[snapValue, sPE_snap]  = snapValue;
                    dataRowBySnapValue[snapValue, sPE_recID] = ri;

                    foreach (settingsPropertyEntry toInclude in sPE_toInclude)
                    {
                        foreach (var pair in columnsByPrefix[prefix])
                        {
                            var spe = dataColumnRenderingSetup.GetSPE(pair);

                            dataRowBySnapValue[snapValue, spe] = si.imbGetPropertySafe(spe.pi);
                        }
                    }
                    riMax = Math.Max(ri, riMax);
                }
            }

            foreach (string prefix in dataByPrefix.Keys)
            {
            }

            //List<Double> data = new List<Double>();
            //foreach (var pair2 in columnsSideAggregationByPrefix[prefix])
            //{
            //    var spe2 = pair.GetSPE();

            //    dataRowBySnapValue[snapValue, spe2] = si.imbGetPropertySafe(spe2.pi);
            //}

            return(output);
        }
Пример #3
0
        /// <summary>
        /// Adds the range rows into table.
        /// </summary>
        /// <param name="namePrefix">Row name prefix.</param>
        /// <param name="targetTable">The target table.</param>
        /// <param name="placeDataRowMarks">if set to <c>true</c> it will set styling conditioners to this table</param>
        /// <param name="rowsToAdd">The rows.</param>
        public void AddRangeRows(String namePrefix, DataTable targetTable, Boolean placeDataRowMarks, dataPointAggregationType rowsToAdd = dataPointAggregationType.sum | dataPointAggregationType.avg | dataPointAggregationType.count | dataPointAggregationType.min | dataPointAggregationType.max | dataPointAggregationType.range)
        {
            Int32 i = 0;

            foreach (DataRow dr in targetTable.Rows)
            {
                if (i < rowsToSkipFromLearning)
                {
                }
                else
                {
                    foreach (var pair in finders)
                    {
                        Object vl = dr[pair.Value.id];

                        if (vl is Int32)
                        {
                            pair.Value.Learn(Convert.ToDouble((Int32)vl));
                        }
                        else if (vl is Double)
                        {
                            pair.Value.Learn((Double)vl);
                        }
                        else if (vl is Boolean)
                        {
                            pair.Value.Learn(Convert.ToDouble((Boolean)vl));
                        }
                    }
                }
                i++;
            }

            List <String> rownamesHMax = new List <string>();
            List <String> rownamesHMin = new List <string>();
            List <String> rownamesH3   = new List <string>();



            foreach (dataPointAggregationType dt in rowsToAdd.getEnumListFromFlags())
            {
                DataRow dr   = targetTable.NewRow();
                String  name = namePrefix + " " + dt.ToString();

                if (keyColumn != null)
                {
                    dr[keyColumn.ColumnName] = name;
                }

                if (columnsToSignIn.Any())
                {
                    foreach (String cn in columnsToSignIn)
                    {
                        dr[cn] = name;
                    }
                }

                if (placeDataRowMarks && keyColumn != null)
                {
                    foreach (DataRow dd in targetTable.Rows)
                    {
                        foreach (var pair in finders)
                        {
                            rangeFinderWithData rf = pair.Value;


                            //Double vl = Convert.ToDouble(dd[rf.id].imbConvertValueSafeTyped<Double>());
                            Double vl = dd[rf.id].imbConvertValueSafeTyped <Double>();
                            switch (dt)
                            {
                            case dataPointAggregationType.max:
                                if (vl == rf.Maximum)
                                {
                                    rownamesHMax.Add(dd[keyColumnName].toStringSafe());
                                }
                                break;

                            case dataPointAggregationType.min:
                                if (vl == rf.Minimum)
                                {
                                    rownamesHMin.Add(dd[keyColumnName].toStringSafe());
                                }

                                break;
                            }
                        }
                    }
                }



                foreach (var pair in finders)
                {
                    rangeFinderWithData rf = pair.Value;

                    try
                    {
                        switch (dt)
                        {
                        case dataPointAggregationType.avg:
                            dr[rf.id] = rf.Average;
                            rownamesH3.Add(name);
                            targetTable.SetAdditionalInfoEntry("Prefix: " + dt.ToString(), "Arithmentic mean");
                            break;

                        case dataPointAggregationType.count:
                            dr[rf.id] = rf.Count;
                            targetTable.SetAdditionalInfoEntry("Prefix: " + dt.ToString(), "Number of rows");
                            break;

                        case dataPointAggregationType.max:
                            rownamesHMax.Add(name);
                            if (rf.Maximum > Double.MinValue)
                            {
                                dr[rf.id] = rf.Maximum;
                            }
                            targetTable.SetAdditionalInfoEntry("Prefix: " + dt.ToString(), "Highest value");
                            break;

                        case dataPointAggregationType.min:
                            rownamesHMin.Add(name);
                            if (rf.Minimum < Double.MaxValue)
                            {
                                dr[rf.id] = rf.Minimum;
                            }
                            targetTable.SetAdditionalInfoEntry("Prefix: " + dt.ToString(), "Smallest value");
                            break;

                        case dataPointAggregationType.range:
                            dr[rf.id] = rf.Range;
                            targetTable.SetAdditionalInfoEntry("Prefix: " + dt.ToString(), "Range of values");
                            break;

                        case dataPointAggregationType.sum:
                            dr[rf.id] = rf.Sum;
                            rownamesH3.Add(name);
                            targetTable.SetAdditionalInfoEntry("Prefix: " + dt.ToString(), "Sum");
                            break;

                        case dataPointAggregationType.entropy:
                            dr[rf.id] = rf.doubleEntries.GetEntropy(1E-06, true);
                            targetTable.SetAdditionalInfoEntry("Prefix: " + dt.ToString(), "Normalized Entropy");
                            rownamesH3.Add(name);
                            break;

                        case dataPointAggregationType.stdev:

                            dr[rf.id] = rf.doubleEntries.GetStdDeviation();
                            rownamesH3.Add(name);
                            targetTable.SetAdditionalInfoEntry("Prefix: " + dt.ToString(), "Standard Deviation");
                            break;

                        case dataPointAggregationType.var:
                            targetTable.SetAdditionalInfoEntry(dt.ToString(), "Variance");
                            dr[rf.id] = rf.doubleEntries.GetVariance();
                            rownamesH3.Add(name);
                            targetTable.SetAdditionalInfoEntry("Prefix: " + dt.ToString(), "Variance");
                            break;
                        }
                    }
                    catch (Exception ex)
                    {
                        targetTable.AddExtra("rangeFinder[" + rf.id + "] failed on [" + dt.ToString() + "] with exception: " + ex.Message);
                        targetTable.AddExtra("::: " + ex.StackTrace);
                    }
                    //if (!targetTable.GetAdditionalInfo().ContainsKey(dt)
                }



                targetTable.Rows.Add(dr);
            }


            targetTable.GetRowMetaSet().SetStyleForRowsWithValue <String>(DataRowInReportTypeEnum.dataHighlightA, keyColumnName, rownamesHMin);
            targetTable.GetRowMetaSet().SetStyleForRowsWithValue <String>(DataRowInReportTypeEnum.dataHighlightB, keyColumnName, rownamesHMax);
            targetTable.GetRowMetaSet().SetStyleForRowsWithValue <String>(DataRowInReportTypeEnum.dataHighlightC, keyColumnName, rownamesH3);
        }