// 5 members with 3 relations between them
            // member 1 has relations to 2 & 3
            // member 4 has a relation to member 3, member 5 has no relations
            public static SetExpectation GetMediumLargeSetCase(GroupRatingConfiguration ratingConfig)
            {
                var relationRatings = new RelationRatingsData().Initialize(3);

                relationRatings[0] = SimpleRelationRatings1;
                relationRatings[1] = SimpleRelationRatings2;
                relationRatings[2] = SimpleRelationRatings3;

                var memberContribution   = (0.8f + 0.9f + 0.72f + 0.5f + 0.3f) / 5f;
                var relationContribution = Mathf.Pow(0.75f * 0.6f * 0.4f, 1f / 3f);

                return(new SetExpectation()
                {
                    RatingConfiguration = ratingConfig,
                    // since we only have one relation, rated 0.75, it contributes all the relation ratings
                    //ApproximateExpectedRating = (memberContribution + relationContribution) * 0.5f,
                    ApproximateExpectedRating = GetExpected(memberContribution, relationContribution, ratingConfig),
                    Members = new[]
                    {
                        new KeyValuePair <int, float>(1, 0.8f),
                        new KeyValuePair <int, float>(4, 0.9f),
                        new KeyValuePair <int, float>(8, 0.72f),
                        new KeyValuePair <int, float>(3, 0.5f),
                        new KeyValuePair <int, float>(10, 0.3f),
                    },
                    RelationRatings = relationRatings,
                    LocalRelationIndices = new[]
                    {
                        new RelationDataPair(0, 1), new RelationDataPair(0, 2), new RelationDataPair(3, 2),
                    }
                });
            }
            static float GetExpected(float membersAverage, float reducedRelations, GroupRatingConfiguration config)
            {
                var members   = membersAverage * config.MemberMatchWeight;
                var relations = reducedRelations * (1f - config.MemberMatchWeight);

                return(members + relations);
            }
            // A very simple Set - 2 members with one Relation between them.
            public static SetExpectation GetSimpleSetCase(GroupRatingConfiguration ratingConfig)
            {
                var relationRatings = new RelationRatingsData().Initialize(1);

                relationRatings[0] = SimpleRelationRatings1;
                return(new SetExpectation()
                {
                    RatingConfiguration = ratingConfig,
                    // since we only have one relation, rated 0.75, it contributes all the relation ratings
                    //ApproximateExpectedRating = ((0.8f + 0.9f) * 0.5f + 0.75f) * 0.5f,
                    ApproximateExpectedRating = GetExpected((0.8f + 0.9f) * 0.5f, 0.75f, ratingConfig),
                    Members = new[]
                    {
                        new KeyValuePair <int, float>(1, 0.8f), new KeyValuePair <int, float>(4, 0.9f),
                    },
                    RelationRatings = relationRatings,
                    LocalRelationIndices = new[] { new RelationDataPair(0, 1) }
                });
            }
コード例 #4
0
        /// <summary>
        /// Verify that a given assignment hypothesis satisfies all Relations, and produce a rating for it if so.
        /// This function assumes that the Set has at least one Relation.
        /// For sets without relations, AverageMemberRating should be used instead.
        /// </summary>
        /// <param name="hypothesis">The assignment combination to verify the validity of</param>
        /// <param name="setRelationsRatings">The relation ratings for the Set</param>
        /// <param name="localRelationPairs">Pairs that map each relation's members within the local collections</param>
        /// <param name="ratingConfiguration">The configured weight to use for producing the final ratings</param>
        /// <param name="reducedRating">The final rating for the combination.  0 if the combination is invalid</param>
        /// <returns>True if the combination was valid, false otherwise</returns>
        internal static bool TryRateAssignmentSet(KeyValuePair <int, float>[] hypothesis,
                                                  RelationRatingsData setRelationsRatings,
                                                  RelationDataPair[] localRelationPairs,
                                                  GroupRatingConfiguration ratingConfiguration,
                                                  out float reducedRating)
        {
            // for every Relation, check if its member's assignments are valid within our hypothesis
            var relationRatings = 1f;

            for (var i = 0; i < localRelationPairs.Length; i++)
            {
                var ratings   = setRelationsRatings[i];
                var indexPair = localRelationPairs[i];
                var child1    = hypothesis[indexPair.Child1].Key;
                var child2    = hypothesis[indexPair.Child2].Key;
                // if this assignment pair doesn't satisfy this relation, we know to move onto another assignment combo
                if (!ratings.TryGetValue(new RelationDataPair(child1, child2), out var pairRating))
                {
                    reducedRating = 0f;
                    return(false);
                }

                relationRatings *= pairRating;
            }

            // combine our relation ratings just like our condition ones - the "inverse power" method
            var reducedRelationRating = Mathf.Pow(relationRatings, 1f / localRelationPairs.Length);

            // combine the relation & member ratings according to the configured weights
            var relationsWeighted = reducedRelationRating * (1f - ratingConfiguration.MemberMatchWeight);
            var membersWeighted   = AverageMemberRating(hypothesis) * ratingConfiguration.MemberMatchWeight;

            reducedRating = relationsWeighted + membersWeighted;

            return(true);
        }