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