internal ConstraintHeader CopyToMatrix(ExactCoverMatrix matrix) { Debug.Assert(FirstLink != null, $"Can't copy a header with a null {nameof(FirstLink)}."); Debug.Assert(!IsSatisfied, $"Can't copy a header that's already satisfied."); var copy = new ConstraintHeader(matrix); foreach (Link?link in GetLinks()) { Square?square = matrix.GetSquare(link.PossibleSquare.Square.Coordinate); Debug.Assert(square != null, $"Tried to copy a square link for a null square at {link.PossibleSquare.Square.Coordinate}."); PossibleValue?possibleSquare = square.GetPossibleValue(link.PossibleSquare.ValueIndex); Debug.Assert(possibleSquare != null, "Tried to link header to null possible square value."); _ = Link.CreateConnectedLink(possibleSquare, copy); } return(copy); }
public static ConstraintHeader CreateConnectedHeader( ExactCoverMatrix matrix, ReadOnlySpan <PossibleValue> possibleSquares) { var header = new ConstraintHeader(matrix); matrix.Attach(header); foreach (PossibleValue?possibleSquare in possibleSquares) { _ = Link.CreateConnectedLink(possibleSquare, header); } if (header.Count == 0) { throw new ArgumentException( $"Must provide at least one {nameof(PossibleValue)} when creating a {nameof(ConstraintHeader)}."); } return(header); }
internal ConstraintHeader(ExactCoverMatrix matrix) { Matrix = matrix; NextHeader = PreviousHeader = this; }