Ejemplo n.º 1
0
        public async Task ShouldAggregateObjects()
        {
            // Arrange
            var fieldName = nameof(Country).ToLowerCamelCase() + "." + nameof(Country.RegionCode).ToLowerCamelCase();
            var request   = new ListItemAggregationRequest
            {
                SearchString = "*",
                SchemaIds    = new List <string> {
                    nameof(Country)
                },
                Aggregators = new List <AggregatorBase>
                {
                    new TermsAggregator {
                        Name = fieldName, Field = fieldName, Size = 20
                    }
                }
            };

            // Act
            ObjectAggregationResult result = await _client.ListItem.AggregateAsync(request).ConfigureAwait(false);

            AggregationResult aggregation = result.GetByName(fieldName);

            // Assert
            Assert.NotNull(aggregation);
            Assert.Equal(20, aggregation.AggregationResultItems.Count);
        }
Ejemplo n.º 2
0
        private AggregationResult Modify(TKey key, TElement element)
        {
            var group = _groups[key];

            group.Modify(element);
            return(AggregationResult.Modified(group));
        }
        private IEnumerable <AggregationResult> RunTicketTypesGroupingQuery(IHqlQuery query, AggregateMethods aggregation, string state)
        {
            var queryResult = CRMHelper.RunGroupByQuery(transactionManager.Value, query, aggregation, "TicketPartRecord.TicketType", state, "ticket");

            var ticketTypes = this.basicDataService.GetTicketTypes();

            List <AggregationResult> returnValue = new List <AggregationResult>();

            foreach (var item in queryResult)
            {
                var ticketType = item.Key != null?ticketTypes.FirstOrDefault(c => c.Id == item.Key.Value) : null;

                string label = ticketType == null?T("[No Ticket Type]").Text : ticketType.Name;

                AggregationResult aggregationResult = new AggregationResult
                {
                    AggregationValue = item.Value,
                    Label            = label,
                    GroupingField    = item.Key
                };

                returnValue.Add(aggregationResult);
            }

            return(returnValue);
        }
Ejemplo n.º 4
0
        private IEnumerable <AggregationResult> Add(TKey key, TElement element)
        {
            if (Equals(key, _defaultKey))
            {
                if (_defaultGroup == null)
                {
                    _defaultGroup = new Grouping(key);
                    _defaultGroup.Add(element);
                    return(new[] { AggregationResult.Added(_defaultGroup) });
                }
                _defaultGroup.Add(element);
                return(new[] { AggregationResult.Modified(_defaultGroup) });
            }

            Grouping group;

            if (!_groups.TryGetValue(key, out group))
            {
                group        = new Grouping(key);
                _groups[key] = group;

                group.Add(element);
                return(new[] { AggregationResult.Added(group) });
            }

            group.Add(element);
            return(new[] { AggregationResult.Modified(group) });
        }
        private IEnumerable <AggregationResult> RunTicketPriorityGroupingQuery(IHqlQuery query, AggregateMethods aggregation)
        {
            var queryResult = this.RunQuery(query, aggregation, "PriorityRecord");

            var priorities = this.basicDataService.GetPriorities();

            List <AggregationResult> returnValue = new List <AggregationResult>();

            foreach (var item in queryResult)
            {
                var priority = item.Key != null?priorities.FirstOrDefault(c => c.Id == item.Key.Value) : null;

                string label = priority == null?T("[No Priority]").Text : priority.Name;

                AggregationResult aggregationResult = new AggregationResult
                {
                    AggregationValue = item.Value,
                    Label            = label,
                    GroupingField    = item.Key
                };

                returnValue.Add(aggregationResult);
            }

            return(returnValue);
        }
Ejemplo n.º 6
0
        private static void AggregateTest(Table table)
        {
            int iterations = 1000;

            AggregationQuery query = new AggregationQuery();

            query.Aggregator         = new Model.Aggregations.SumAggregator();
            query.AggregationColumns = new string[] { "ID" };
            query.TableName          = "Bugs";
            query.Where = SelectQuery.ParseWhere("\"Created Date\" < \"2013-01-01\"");

            query.Dimensions.Add(new AggregationDimension("Priority", "Priority < 0", "Priority = 0", "Priority = 1", "Priority > 1"));
            query.Dimensions.Add(new AggregationDimension("Framework", "Maui", "Apex", "Tao"));
            //query.Dimensions.Add(new AggregationDimension("Created Month",
            //    "\"Created Date\" >= \"2011-01-01\" AND \"Created Date\" < \"2011-02-01\"",
            //    "\"Created Date\" >= \"2011-02-01\" AND \"Created Date\" < \"2011-03-01\"",
            //    "\"Created Date\" >= \"2011-03-01\" AND \"Created Date\" < \"2011-04-01\""
            //));

            AggregationResult result = null;

            Console.WriteLine("\r\n{0}\r\n", query);

            Trace.Write("Aggregating Bugs...");

            for (int i = 0; i < iterations; ++i)
            {
                result = table.Query(query);
            }

            Console.WriteLine();
            ShowResult(result.Values);
        }
Ejemplo n.º 7
0
        public IEnumerable <AggregationResult> Remove(object fact)
        {
            var item = (TElement)fact;

            _items.Remove(item);
            return(new[] { AggregationResult.Modified(_items) });
        }
Ejemplo n.º 8
0
        public IEnumerable <AggregationResult> Modify(AggregationContext context, ITuple tuple, IEnumerable <IFact> facts)
        {
            var results = new List <AggregationResult>();

            foreach (var fact in facts)
            {
                var collection = (IEnumerable <TElement>)fact.Value;
                foreach (var value in collection)
                {
                    if (_firstElements.TryGetValue(fact, out var oldFirst))
                    {
                        if (Equals(oldFirst, value))
                        {
                            results.Add(AggregationResult.Modified(value, value, Enumerable.Repeat(fact, 1)));
                        }
                        else
                        {
                            results.Add(AggregationResult.Removed(oldFirst));
                            results.Add(AggregationResult.Added(value, Enumerable.Repeat(fact, 1)));
                        }
                    }
                    else
                    {
                        results.Add(AggregationResult.Added(value, Enumerable.Repeat(fact, 1)));
                    }
                    _firstElements[fact] = value;
                    break;
                }
            }
            return(results);
        }
        private IResponse AllCount(IRequestContext ctx, Route route)
        {
            string queryString = ctx.Request.ResourceParameters["q"] ?? "";
            AllCountResult result = new AllCountResult(queryString);

            // Build a Count query
            IQuery<AggregationResult> query = new AggregationQuery("count", null, queryString);

            // Wrap in Joins, if found
            query = WrapInJoinQueryIfFound(query, this.Database, ctx);

            // Run server correctors
            using (ctx.Monitor(MonitorEventLevel.Verbose, "Correct", type: "AllCount", detail: query.Where.ToString()))
            {
                query.Correct(this.CurrentCorrectors(ctx));
            }

            // Accumulate Results for each table
            IPrincipal user = ctx.Request.User;
            using (ctx.Monitor(MonitorEventLevel.Information, "AllCount", type: "AllCount", detail: query.Where.ToString()))
            {
                IExpression defaultWhere = query.Where;

                foreach (string tableName in this.Database.TableNames)
                {
                    if (this.HasTableAccess(tableName, user, PermissionScope.Reader))
                    {
                        query.TableName = tableName;
                        query.Where = defaultWhere;

                        AggregationResult tableCount = this.Database.Query(query, (si) => this.IsInIdentity(ctx.Request.User, si));

                        if (!tableCount.Details.Succeeded || tableCount.Values == null)
                        {
                            result.ResultsPerTable.Add(new CountResult(tableName, 0, true, false));
                        }
                        else
                        {
                            result.ResultsPerTable.Add(new CountResult(tableName, (ulong)tableCount.Values[0, 0], true, tableCount.Details.Succeeded));
                        }
                    }
                    else
                    {
                        result.ResultsPerTable.Add(new CountResult(tableName, 0, false, false));
                    }
                }
            }

            // Sort results so that succeeding tables are first and are subsorted by count [descending]
            result.ResultsPerTable.Sort((left, right) =>
            {
                int order = right.Succeeded.CompareTo(left.Succeeded);
                if (order != 0) return order;

                return right.Count.CompareTo(left.Count);
            });

            return ArribaResponse.Ok(result);
        }
Ejemplo n.º 10
0
        public IEnumerable <AggregationResult> Remove(object fact)
        {
            var source   = (TSource)fact;
            var oldValue = _sourceToValue[source];

            _sourceToValue.Remove(source);
            return(new[] { AggregationResult.Removed(oldValue) });
        }
Ejemplo n.º 11
0
        public IEnumerable <AggregationResult> Add(object fact)
        {
            var source = (TSource)fact;
            var value  = _selector(source);

            _sourceToValue[source] = value;
            return(new[] { AggregationResult.Added(value) });
        }
Ejemplo n.º 12
0
        private Fact CreateAggregateFact(AggregationResult result)
        {
            var fact = new SyntheticFact(result.Aggregate);

            fact.Source = new AggregateFactSource(result.Source);
            _aggregateFactMap.Add(result.Aggregate, fact);
            return(fact);
        }
Ejemplo n.º 13
0
        public IEnumerable <AggregationResult> Remove(object fact)
        {
            var source  = (TSource)fact;
            var oldList = _sourceToList[source];

            _sourceToList.Remove(source);
            return(oldList.Select(x => AggregationResult.Removed(x)).ToArray());
        }
 public IEnumerable <AggregationResult> Add(ITuple tuple, IEnumerable <IFact> facts)
 {
     AddFacts(facts);
     if (!_created)
     {
         _created = true;
         return(new[] { AggregationResult.Added(_items) });
     }
     return(new[] { AggregationResult.Modified(_items) });
 }
Ejemplo n.º 15
0
        public IEnumerable <AggregationResult> Add(object fact)
        {
            var source = (TSource)fact;
            var value  = _selector(source);
            var list   = value.ToList();

            _sourceToList[source] = list;

            return(list.Select(x => AggregationResult.Added(x)).ToArray());
        }
Ejemplo n.º 16
0
        public IEnumerable <AggregationResult> RunNumericAggregation(IHqlQuery query, AggregateMethods aggregateMethod, string fieldName, string partName, int interval)
        {
            string groupKey   = string.Format(CultureInfo.InvariantCulture, "cast( floor(field.Value/{0}) as Double) ", interval.ToString(CultureInfo.InvariantCulture));
            string groupValue = string.Empty;

            switch (aggregateMethod)
            {
            case AggregateMethods.Count:
                groupValue = "COUNT(*)";
                break;

            case AggregateMethods.Sum:
                groupValue = "SUM(field.Value)";
                break;

            case AggregateMethods.Average:
                groupValue = "AVG(field.Value)";
                break;

            case AggregateMethods.Minimum:
                groupValue = "MAX(field.Value)";
                break;

            case AggregateMethods.Maximum:
                groupValue = "MIN(field.Value)";
                break;

            default:
                throw new ArgumentException("Aggregate method is not provided");
            }

            var result = this.RunQuery(query, fieldName, partName, groupKey, groupValue, "DecimalFieldIndexRecords");

            List <AggregationResult> returnValue = new List <AggregationResult>();

            foreach (var group in result)
            {
                double value = double.Parse(group["GroupValue"].ToString());
                int?   key   = group["GroupKey"] != null ? (int?)int.Parse(group["GroupKey"].ToString()) : null;

                string keyLabel = !key.HasValue ? T("[{0}]", "Null").Text : T("{0} between {1}-{2}", fieldName, (key.Value * interval).ToString(CultureInfo.InvariantCulture), ((key.Value + 1) * interval).ToString(CultureInfo.InvariantCulture)).Text;

                AggregationResult aggregationResult = new AggregationResult
                {
                    AggregationValue = value,
                    Label            = keyLabel,
                    GroupingField    = key
                };

                returnValue.Add(aggregationResult);
            }

            return(returnValue);
        }
Ejemplo n.º 17
0
        /// <summary>
        /// This method determines if the current data sources within the collection can
        /// be successfully joined.
        /// </summary>
        /// <returns>
        /// A value of Success is returned if the data sources can be joined.
        /// </returns>
        /// <remarks>
        ///  Revision History
        ///  MM/DD/YY Who Version Issue#        Description
        ///  -------- --- ------- ------------- -----------------------------------
        ///  08/26/08 MAH 9.50				    Created
        ///  12/22/08 MAH 9.50.28 CQ 124459     Added check for number of channels
        /// </remarks>
        public AggregationResult Validate()
        {
            AggregationResult ValidationResult = ValidateDeviceID();

            if (ValidationResult == AggregationResult.Success)
            {
                if (m_lstDataSources.Count == 0)
                {
                    ValidationResult = AggregationResult.NoContributors;
                }
            }

            if (ValidationResult == AggregationResult.Success)
            {
                if (NumProfileChannels == 0)
                {
                    ValidationResult = AggregationResult.NoContributors;
                }
            }

            if (ValidationResult == AggregationResult.Success)
            {
                if (IntervalLength == 0)
                {
                    ValidationResult = AggregationResult.IntervalLengthMismatch;
                }
            }

            if (ValidationResult == AggregationResult.Success)
            {
                if (!VerifyDSTConsistency())
                {
                    ValidationResult = AggregationResult.DSTMismatch;
                }
            }

            if (ValidationResult == AggregationResult.Success)
            {
                if (!VerifyChannelCount())
                {
                    ValidationResult = AggregationResult.ChannelMismatch;
                }
            }

            if (ValidationResult == AggregationResult.Success)
            {
                if (!VerifyChannelConsistency())
                {
                    ValidationResult = AggregationResult.QuantityMismatch;
                }
            }

            return(ValidationResult);
        }
Ejemplo n.º 18
0
        public IEnumerable <AggregationResult> Remove(ITuple tuple, IEnumerable <IFact> facts)
        {
            var results = new List <AggregationResult>();

            foreach (var fact in facts)
            {
                var oldValue = _sourceToValue[fact];
                _sourceToValue.Remove(fact);
                results.Add(AggregationResult.Removed(oldValue));
            }
            return(results);
        }
Ejemplo n.º 19
0
        public IEnumerable <AggregationResult> Modify(object fact)
        {
            var source  = (TSource)fact;
            var value   = _selector(source);
            var list    = value.ToList();
            var oldList = _sourceToList[source];

            _sourceToList[source] = list;

            return(oldList.Select(x => AggregationResult.Removed(x)).Concat(
                       list.Select(x => AggregationResult.Added(x))).ToArray());
        }
Ejemplo n.º 20
0
        private AggregationResult Remove(TKey key, TElement element)
        {
            var group = _groups[key];

            group.Remove(element);
            if (group.Count == 0)
            {
                _groups.Remove(key);
                return(AggregationResult.Removed(group));
            }
            return(AggregationResult.Modified(group));
        }
Ejemplo n.º 21
0
        public IEnumerable <AggregationResult> Add(ITuple tuple, IEnumerable <IFact> facts)
        {
            var results = new List <AggregationResult>();

            foreach (var fact in facts)
            {
                var value = _selector.Invoke(tuple, fact);
                _sourceToValue[fact] = value;
                results.Add(AggregationResult.Added(value));
            }
            return(results);
        }
Ejemplo n.º 22
0
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            var result = new AggregationResult();

            while (reader.Read())
            {
                switch (reader.TokenType)
                {
                case JsonToken.PropertyName:
                    var name = reader.Value as string;
                    reader.Read();
                    switch (name)
                    {
                    case "doc_count_error_upper_bound":
                        result.DocumentCountErrorUpperBound = serializer.Deserialize <long>(reader);
                        break;

                    case "sum_other_doc_count":
                        result.SumOtherDocumentCount = serializer.Deserialize <long>(reader);
                        break;

                    case "buckets":
                        if (reader.TokenType == JsonToken.StartArray)
                        {
                            var aggs = new List <AggregationBucket>();
                            while (reader.Read() && reader.TokenType != JsonToken.EndArray)
                            {
                                aggs.Add(serializer.Deserialize <AggregationBucket>(reader));
                            }
                            result.Buckets = aggs;
                        }
                        break;

                    default:
                        if (reader.TokenType == JsonToken.StartObject)
                        {
                            var agg = serializer.Deserialize <AggregationResult>(reader);
                            result.AddAggregation(name, agg);
                        }
                        break;
                    }
                    break;

                case JsonToken.EndObject:
                    return(result);

                default:
                    break;
                }
            }
            return(result);
        }
        public void TestApplyAndFilterAggregations()
        {
            /**
             *   127.0.0.1:6379> FT.CREATE test_index SCHEMA name TEXT SORTABLE subj1 NUMERIC SORTABLE subj2 NUMERIC SORTABLE
             *   OK
             *   127.0.0.1:6379> FT.ADD test_index data1 1.0 FIELDS name abc subj1 20 subj2 70
             *   OK
             *   127.0.0.1:6379> FT.ADD test_index data2 1.0 FIELDS name def subj1 60 subj2 40
             *   OK
             *   127.0.0.1:6379> FT.ADD test_index data3 1.0 FIELDS name ghi subj1 50 subj2 80
             *   OK
             *   127.0.0.1:6379> FT.ADD test_index data1 1.0 FIELDS name abc subj1 30 subj2 20
             *   OK
             *   127.0.0.1:6379> FT.ADD test_index data2 1.0 FIELDS name def subj1 65 subj2 45
             *   OK
             *   127.0.0.1:6379> FT.ADD test_index data3 1.0 FIELDS name ghi subj1 70 subj2 70
             *   OK
             */

            Client cl = GetClient();
            Schema sc = new Schema();

            sc.AddSortableTextField("name", 1.0);
            sc.AddSortableNumericField("subj1");
            sc.AddSortableNumericField("subj2");
            cl.CreateIndex(sc, new ConfiguredIndexOptions());
            cl.AddDocument(new Document("data1").Set("name", "abc").Set("subj1", 20).Set("subj2", 70));
            cl.AddDocument(new Document("data2").Set("name", "def").Set("subj1", 60).Set("subj2", 40));
            cl.AddDocument(new Document("data3").Set("name", "ghi").Set("subj1", 50).Set("subj2", 80));
            cl.AddDocument(new Document("data4").Set("name", "abc").Set("subj1", 30).Set("subj2", 20));
            cl.AddDocument(new Document("data5").Set("name", "def").Set("subj1", 65).Set("subj2", 45));
            cl.AddDocument(new Document("data6").Set("name", "ghi").Set("subj1", 70).Set("subj2", 70));

            AggregationBuilder r = new AggregationBuilder().Apply("(@subj1+@subj2)/2", "attemptavg")
                                   .GroupBy("@name", Reducers.Avg("@attemptavg").As("avgscore"))
                                   .Filter("@avgscore>=50")
                                   .SortBy(10, SortedField.Ascending("@name"));

            // actual search
            AggregationResult res = cl.Aggregate(r);
            Row?r1 = res.GetRow(0);

            Assert.NotNull(r1);
            Assert.Equal("def", r1.Value.GetString("name"));
            Assert.Equal(52.5, r1.Value.GetDouble("avgscore"));

            Row?r2 = res.GetRow(1);

            Assert.NotNull(r2);
            Assert.Equal("ghi", r2.Value.GetString("name"));
            Assert.Equal(67.5, r2.Value.GetDouble("avgscore"));
        }
Ejemplo n.º 24
0
        public IEnumerable <AggregationResult> Modify(AggregationContext context, ITuple tuple, IEnumerable <IFact> facts)
        {
            var results = new List <AggregationResult>();

            foreach (var fact in facts)
            {
                var value    = _selector.Invoke(context, tuple, fact);
                var oldValue = (TResult)_sourceToValue[fact];
                _sourceToValue[fact] = value;
                results.Add(AggregationResult.Modified(value, oldValue, Enumerable.Repeat(fact, 1)));
            }
            return(results);
        }
Ejemplo n.º 25
0
        private IEnumerable <AggregationResult> Modify(TKey key, TElement element)
        {
            if (Equals(key, _defaultKey))
            {
                _defaultGroup.Modify(element);
                return(new[] { AggregationResult.Modified(_defaultGroup) });
            }

            var group = _groups[key];

            group.Modify(element);
            return(new[] { AggregationResult.Modified(group) });
        }
Ejemplo n.º 26
0
        private Fact RemoveAggregateFact(AggregationResult result)
        {
            if (!_aggregateFactMap.TryGetValue(result.Aggregate, out var fact))
            {
                throw new InvalidOperationException(
                          $"Fact for aggregate object does not exist. AggregatorType={_aggregator.GetType()}, FactType={result.Aggregate.GetType()}");
            }

            _aggregateFactMap.Remove(fact.RawObject);
            fact.RawObject = result.Aggregate;
            fact.Source    = null;
            return(fact);
        }
Ejemplo n.º 27
0
        public void Average()
        {
            var          counterData     = new MetricsBag();
            const double expectedAverage = 3.33;

            counterData.Add(-5);
            counterData.Add(5);
            counterData.Add(10);

            AggregationResult agg = counterData.CalculateAggregation();

            Assert.AreEqual(expectedAverage, Math.Round(agg.Average, 2));
        }
Ejemplo n.º 28
0
        public IEnumerable <AggregationResult> Remove(IEnumerable <object> facts)
        {
            var results = new List <AggregationResult>();

            foreach (var fact in facts)
            {
                var source   = (TSource)fact;
                var oldValue = _sourceToValue[source];
                _sourceToValue.Remove(source);
                results.Add(AggregationResult.Removed(oldValue));
            }
            return(results);
        }
Ejemplo n.º 29
0
        public IEnumerable <AggregationResult> Add(IEnumerable <object> facts)
        {
            var results = new List <AggregationResult>();

            foreach (var fact in facts)
            {
                var source = (TSource)fact;
                var value  = _selector(source);
                _sourceToValue[source] = value;
                results.Add(AggregationResult.Added(value));
            }
            return(results);
        }
Ejemplo n.º 30
0
        public IEnumerable <AggregationResult> Modify(IEnumerable <object> facts)
        {
            var keys         = new List <TKey>();
            var resultLookup = new DefaultKeyMap <TKey, AggregationResult>();

            foreach (var fact in facts)
            {
                var source     = (TSource)fact;
                var key        = _keySelector(source);
                var element    = _elementSelector(source);
                var oldKey     = _sourceToKey[fact];
                var oldElement = _sourceToElement[fact];
                _sourceToKey[fact]     = key;
                _sourceToElement[fact] = element;

                if (Equals(key, oldKey))
                {
                    var result = Modify(key, element);
                    if (!resultLookup.ContainsKey(key))
                    {
                        keys.Add(key);
                        resultLookup[key] = result;
                    }
                }
                else
                {
                    var result1 = Remove(oldKey, oldElement);
                    if (!resultLookup.ContainsKey(oldKey))
                    {
                        keys.Add(oldKey);
                    }
                    resultLookup[oldKey] = result1;

                    var result2 = Add(key, element);
                    AggregationResult previousResult;
                    if (!resultLookup.TryGetValue(key, out previousResult))
                    {
                        keys.Add(key);
                        resultLookup[key] = result2;
                    }
                    else if (previousResult.Action == AggregationAction.Removed ||
                             result2.Action == AggregationAction.Added)
                    {
                        resultLookup[key] = AggregationResult.Modified(previousResult.Aggregate);
                    }
                }
            }
            var results = GetResults(keys, resultLookup);

            return(results);
        }
        /// <summary>
        /// Aggregates all actions defined for a controller.
        /// </summary>
        /// <param name="seed">The object that contains the Action definitions.</param>
        /// <param name="ignoreCachable">If set to <see langword="true"/>, all actions will be treated equally. The result will then contain the same lists for cachable and uncachable.</param>
        /// <returns></returns>
        public static AggregationResult Aggregate( IControllerTemplate seed, bool ignoreCachable = false )
        {
            StringBuilder actions           = new StringBuilder();
              StringBuilder uncachableActions = new StringBuilder();

              // If ignoreCachable is set, we'll aggregate them all into "actions"
              foreach( Action action in seed.Actions ) {
            if( action.Uncachable && !ignoreCachable ) {
              uncachableActions.Append(  action.Name + "," );
            } else {
              actions.Append( action.Name + "," );
            }
              }

              string actionsCachable = actions.ToString();
              actionsCachable = ( actionsCachable.Length > 0 )
                          ? actionsCachable.Substring( 0, actionsCachable.Length - 1 )
                          : actionsCachable;

              string actionsUncachable = uncachableActions.ToString();
              actionsUncachable = ( actionsUncachable.Length > 0 )
                          ? actionsUncachable.Substring( 0, actionsUncachable.Length - 1 )
                          : actionsUncachable;
              var controllerData =
              new {controllerName = NameHelper.UpperCamelCase( seed.Name ), actionList = actionsCachable };
              var uncachableControllerData =
              new {controllerName = NameHelper.UpperCamelCase( seed.Name ), actionList = actionsUncachable };

              AggregationResult result = new AggregationResult {
                                                         Cachable = ActionTemplate.FormatSmart( controllerData ),
                                                         Uncachable = ActionTemplate.FormatSmart( uncachableControllerData )
                                                       };

              if( ignoreCachable ) {
            result.Uncachable = result.Cachable;
              }

              return result;
        }
Ejemplo n.º 32
0
    private static AggregationResult RunAggregation(ClusterNetwork net, double bias)
    {
        Dictionary<Vertex, double> _attributes = new Dictionary<Vertex, double>();
        Dictionary<Vertex, double> _aggregates = new Dictionary<Vertex, double>();

        MathNet.Numerics.Distributions.Normal normal = new MathNet.Numerics.Distributions.Normal(0d, 5d);

        AggregationResult result = new AggregationResult();

        result.Modularity = net.NewmanModularityUndirected;

        double average = 0d;

        foreach (Vertex v in net.Vertices)
        {
            _attributes[v] = normal.Sample();
            _aggregates[v] = _attributes[v];
            average += _attributes[v];
        }
        average /= (double)net.VertexCount;

        double avgEstimate = double.MaxValue;

        result.FinalVariance = double.MaxValue;
        result.FinalOffset = 0d;

        for (int k = 0; k < Properties.Settings.Default.ConsensusRounds; k++)
        {
            foreach (Vertex v in net.Vertices.ToArray())
            {
                Vertex w = v.RandomNeighbor;
                List<Vertex> intraNeighbors = new List<Vertex>();
                List<Vertex> interNeighbors = new List<Vertex>();
                ClassifyNeighbors(net, v, intraNeighbors, interNeighbors);

                double r = net.NextRandomDouble();
                if (r <= bias && interNeighbors.Count > 0)
                    w = interNeighbors.ElementAt(net.NextRandom(interNeighbors.Count));

                _aggregates[v] = aggregate(_aggregates[v], _aggregates[w]);
                _aggregates[w] = aggregate(_aggregates[v], _aggregates[w]);
            }

            avgEstimate = 0d;
            foreach (Vertex v in net.Vertices.ToArray())
                avgEstimate += _aggregates[v];
            avgEstimate /= (double)net.VertexCount;

            result.FinalVariance = 0d;
            foreach (Vertex v in net.Vertices.ToArray())
                result.FinalVariance += Math.Pow(_aggregates[v] - avgEstimate, 2d);
            result.FinalVariance /= (double)net.VertexCount;

            double intraVar = 0d;
            foreach (int c in net.ClusterIDs)
            {
                double localavg = 0d;
                double localvar = 0d;

                foreach (Vertex v in net.GetNodesInCluster(c))
                    localavg += _aggregates[v];
                localavg /= net.GetClusterSize(c);

                foreach (Vertex v in net.GetNodesInCluster(c))
                    localvar += Math.Pow(_aggregates[v] - localavg, 2d);
                localvar /= net.GetClusterSize(c);

                intraVar += localvar;
            }
            intraVar /= 50d;

            //Console.WriteLine("i = {0:0000}, Avg = {1:0.000}, Estimate = {2:0.000}, Intra-Var = {3:0.000}, Total Var = {4:0.000}", result.iterations, average, avgEstimate, intraVar, totalVar);
        }
        result.FinalOffset = average - avgEstimate;

        return result;
    }