internal PivotsExpression Simplify(Dictionary<string, Pivots.Pivot> pivotVsPivotValues)
{
if (invariant)
return this;
if (matching_combinations.Count == 0)
return False;
int possible_combinations = 1;
foreach (string pivot in relevant_pivots) {
possible_combinations *= pivotVsPivotValues[pivot].Choices.Keys.Count;
}
if (matching_combinations.Count == possible_combinations)
return True;
foreach (string pivot in relevant_pivots) {
var values = pivotVsPivotValues[pivot].Choices.Keys;
if (matching_combinations.Count % values.Count != 0)
continue;
int reduced_combinations = matching_combinations.Count / values.Count;
ComparableHashSet<ComparableHashSet<string>> new_combinations = new ComparableHashSet<ComparableHashSet<string>>();
foreach (var combination in matching_combinations) {
ComparableHashSet<string> reduced_combination = new ComparableHashSet<string>(combination);
reduced_combination.ExceptWith(values);
new_combinations.Add(reduced_combination);
if (new_combinations.Count > reduced_combinations)
break;
}
if (new_combinations.Count == reduced_combinations) {
PivotsExpression result = new PivotsExpression();
result.relevant_pivots = new HashSet<string>(relevant_pivots);
result.relevant_pivots.Remove(pivot);
result.matching_combinations = new_combinations;
return result.Simplify(pivotVsPivotValues);
}
}
return this;
}