/// <summary>
		/// Constructs a partial constraint checker for the given 
		/// </summary>
		/// <param name="dimensionValues"></param>
		/// <param name="constraints"></param>
		public PartialVectorConstraintChecker(ReadOnlyCollection<DimensionWithValues> dimensionValues, IEnumerable<IConstraint> constraints)
		{
			_dimensionValues = dimensionValues;
			List<PossiblyExtendedConstraint> extendedConstraints = new List<PossiblyExtendedConstraint>();
			foreach (IConstraint constraint in constraints)
			{
				PossiblyExtendedConstraint extendedConstraint;
				if (constraint.RequiredDimensions.SelectMany(d => ExpandOuterMatrixDimensionIfNeeded(d, dimensionValues)).Count() > _maxDimensionCountToExtend)
				{
					extendedConstraint = new NonExtendedConstraint(GetDimensionIndexes(constraint, dimensionValues), constraint, dimensionValues);
				}
				else
				{
					extendedConstraint = ExtendConstraint(constraint, dimensionValues);
				}
				extendedConstraints.Add(extendedConstraint);
			}
			// Possible optimization: Discover implied constraints among the actually extended constraints and add them.
			_extendedConstraints = extendedConstraints.AsReadOnly();
		}
        /// <summary>
        /// Constructs a partial constraint checker for the given
        /// </summary>
        /// <param name="dimensionValues"></param>
        /// <param name="constraints"></param>
        public PartialVectorConstraintChecker(ReadOnlyCollection <DimensionWithValues> dimensionValues, IEnumerable <IConstraint> constraints)
        {
            _dimensionValues = dimensionValues;
            List <PossiblyExtendedConstraint> extendedConstraints = new List <PossiblyExtendedConstraint>();

            foreach (IConstraint constraint in constraints)
            {
                PossiblyExtendedConstraint extendedConstraint;
                if (constraint.RequiredDimensions.SelectMany(d => ExpandOuterMatrixDimensionIfNeeded(d, dimensionValues)).Count() > _maxDimensionCountToExtend)
                {
                    extendedConstraint = new NonExtendedConstraint(GetDimensionIndexes(constraint, dimensionValues), constraint, dimensionValues);
                }
                else
                {
                    extendedConstraint = ExtendConstraint(constraint, dimensionValues);
                }
                extendedConstraints.Add(extendedConstraint);
            }
            // Possible optimization: Discover implied constraints among the actually extended constraints and add them.
            _extendedConstraints = extendedConstraints.AsReadOnly();
        }