// 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) } }); }
/// <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); }