private static ExtendedConstraint ExtendConstraint(IConstraint constraint, ReadOnlyCollection <DimensionWithValues> dimensionValues)
        {
            List <int> dimensionIndexes = GetDimensionIndexes(constraint, dimensionValues).ToList();

            if (dimensionIndexes.Count == 0)
            {
                throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture,
                                                                  "Constraint {0} doesn't have any required dimensions.", constraint.GetType().Name));
            }
            ReadOnlyCollection <DimensionWithValues> dimensionValuesSubset = dimensionIndexes.Select(di => dimensionValues[di]).ToList().AsReadOnly();
            ExtendedConstraint ret = new ExtendedConstraint(dimensionIndexes, dimensionValues);

            foreach (ReadOnlyCollection <int> indexes in CombinatorialUtilities.GetAllIndexCombinations(dimensionValuesSubset.Select(dv => dv.Values.Count)))
            {
                Vector v = CombinatorialUtilities.ConstructVector(dimensionValuesSubset, indexes);
                if (constraint.IsValid(v))
                {
                    ret.AddNewValueCombinations(indexes);
                }
            }
            return(ret);
        }
		private static ExtendedConstraint ExtendConstraint(IConstraint constraint, ReadOnlyCollection<DimensionWithValues> dimensionValues)
		{
			List<int> dimensionIndexes = GetDimensionIndexes(constraint, dimensionValues).ToList();
			if (dimensionIndexes.Count == 0)
			{
				throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture,
					"Constraint {0} doesn't have any required dimensions.", constraint.GetType().Name));
			}
			ReadOnlyCollection<DimensionWithValues> dimensionValuesSubset = dimensionIndexes.Select(di => dimensionValues[di]).ToList().AsReadOnly();
			ExtendedConstraint ret = new ExtendedConstraint(dimensionIndexes, dimensionValues);
			foreach (ReadOnlyCollection<int> indexes in CombinatorialUtilities.GetAllIndexCombinations(dimensionValuesSubset.Select(dv => dv.Values.Count)))
			{
				Vector v = CombinatorialUtilities.ConstructVector(dimensionValuesSubset, indexes);
				if (constraint.IsValid(v))
				{
					ret.AddNewValueCombinations(indexes);
				}
			}
			return ret;
		}