static bool FindTraitCollections <T>(MARSTraitDataProvider <T> traitProvider, IRelation <T>[] conditions, List <RelationTraitCache.ChildTraits <T> > traitCollections) { traitCollections.Clear(); foreach (var condition in conditions) { if (!traitProvider.TryGetAllTraitValues(condition.child1TraitName, out var traits)) { return(false); } if (!traitProvider.TryGetAllTraitValues(condition.child2TraitName, out var traits2)) { return(false); } traitCollections.Add(new RelationTraitCache.ChildTraits <T>() { One = traits, Two = traits2 }); } return(true); }
public bool RateConditionMatches <T>(ICondition <T>[] conditions, MARSTraitDataProvider <T> traitProvider, List <Dictionary <int, float> > preAllocatedRatingStorage) { if (conditions == null) { return(true); } for (var i = 0; i < conditions.Length; i++) { var condition = conditions[i]; Dictionary <int, T> traits; if (!traitProvider.TryGetAllTraitValues(condition.traitName, out traits)) { return(false); // trait not found } var ratings = preAllocatedRatingStorage[i]; ratings.Clear(); foreach (var kvp in traits) { var value = kvp.Value; var rating = condition.RateDataMatch(ref value); // exclude all failing pieces of data from the results list if (rating <= 0f) { continue; } var id = kvp.Key; ratings.Add(id, rating); } if (ratings.Count == 0) // trait found, but no matches { return(false); } } return(true); }