Esempio n. 1
0
        public void CreateFullyConnected_ConnectsCorrectly(int numPossibilities, int numRequired, bool asConcrete)
        {
            int size          = 4;
            var puzzle        = new Puzzle(size);
            var matrix        = ExactCoverGraph.Create(puzzle);
            var possibilities = Possibilities.CreatePossibilities(new Coordinate(), numPossibilities);

            Objective objective;

            if (asConcrete)
            {
                objective = Objective.CreateFullyConnected(matrix,
                                                           new ReadOnlySpan <Possibility>(possibilities),
                                                           numRequired);
            }
            else
            {
                objective = Objective.CreateFullyConnected(matrix,
                                                           new ReadOnlySpan <IPossibility>(possibilities),
                                                           numRequired);
            }

            Assert.True(objective.AllUnknownPossibilitiesAreConcrete);
            Assert.True(((IObjective)objective).IsRequired);
            Assert.Equal(numPossibilities == numRequired, objective.AllUnknownPossibilitiesAreRequired);
            Assert.NotEqual(NodeState.SELECTED, objective.State);
            Assert.Equal(possibilities.Length, objective.CountUnknown);
            Assert.Equal(numRequired, objective.TotalCountToSatisfy);
            Assert.All(possibilities,
                       p => Assert.Contains(p, ((IObjective)objective).GetUnknownDirectPossibilities()));
            Assert.All(((IObjective)objective).GetUnknownDirectPossibilities(),
                       p => Assert.Contains(p, possibilities));
            Assert.Contains(objective, matrix.GetUnsatisfiedRequiredObjectivesWithConcretePossibilities());
        }
Esempio n. 2
0
        public void CreateWithPossibilities_NeedsMoreThanPossible_Throws()
        {
            var possibilities = Possibilities.CreatePossibilities(new Coordinate(), 1);

            Assert.Throws <ArgumentException>(
                () => OptionalObjective.CreateWithPossibilities(possibilities, 2));
        }
Esempio n. 3
0
 public void CascadingDropUpDownUpWithDropAtMidpoint()
 {
     var puzzle          = new Puzzle(4);
     var matrix          = ExactCoverGraph.Create(puzzle);
     var possibilities   = Possibilities.CreatePossibilities(new Coordinate(), 3);
     var required        = Objective.CreateFullyConnected(matrix, new ReadOnlySpan <Possibility>(possibilities), 1);
     var fakePossibility = new FakePossibility();
     var optional        = OptionalObjective.CreateWithPossibilities(
         possibilities[1..3], 2);
Esempio n. 4
0
        public void CreateWithPossibilities_ConnectsCorrectly(int numPossibilities, int numToSatisfy)
        {
            var        possibilities     = Possibilities.CreatePossibilities(new Coordinate(), numPossibilities);
            var        concreteObjective = OptionalObjective.CreateWithPossibilities(possibilities, numToSatisfy);
            IObjective objective         = concreteObjective;

            Assert.Equal(numToSatisfy, concreteObjective.TotalCountToSatisfy);
            Assert.Equal(NodeState.UNKNOWN, concreteObjective.State);
            Assert.False(objective.IsRequired);
            Assert.Equal(
                new HashSet <IPossibility>(possibilities),
                new HashSet <IPossibility>(objective.GetUnknownDirectPossibilities()));
        }
Esempio n. 5
0
        public void CreateFullyConnected_WithOptionalObjectives_ConnectsCorrectly()
        {
            var puzzle             = new Puzzle(4);
            var matrix             = ExactCoverGraph.Create(puzzle);
            var optionalObjectives = new OptionalObjective[] {
                OptionalObjective.CreateWithPossibilities(Possibilities.CreatePossibilities(new Coordinate(), 2), 1),
                OptionalObjective.CreateWithPossibilities(Possibilities.CreatePossibilities(new Coordinate(), 2), 1),
            };
            var        concreteObjective = Objective.CreateFullyConnected(matrix, optionalObjectives, 1);
            IObjective objective         = concreteObjective;

            Assert.Equal(
                new HashSet <IPossibility>(optionalObjectives),
                new HashSet <IPossibility>(objective.GetUnknownDirectPossibilities()));
        }
Esempio n. 6
0
        public void CascadingDropUpDownUp()
        {
            var puzzle          = new Puzzle(4);
            var matrix          = ExactCoverGraph.Create(puzzle);
            var possibilities   = Possibilities.CreatePossibilities(new Coordinate(), 2);
            var required        = Objective.CreateFullyConnected(matrix, new ReadOnlySpan <Possibility>(possibilities), 1);
            var fakePossibility = new FakePossibility();
            var optional        = OptionalObjective.CreateWithPossibilities(
                possibilities.Cast <IPossibility>().ToArray(), 2);
            var fakeLinkToOptional = Link.CreateConnectedLink(fakePossibility, optional);
            var separateRequired   = Objective.CreateFullyConnected(matrix, new IPossibility[] { optional }, 1);


            // Additionally try one where optional ends up dropped before the cascade somehow... maybe add one to possibilities and to optional's countToSatisfy.

            Assert.True(possibilities[0].TrySelect());
            Assert.Equal(NodeState.SELECTED, possibilities[0].State);
            Assert.Equal(NodeState.DROPPED, possibilities[1].State);
            Assert.Equal(NodeState.UNKNOWN, optional.State);
            Assert.Empty(fakePossibility.DroppedFromObjectives);
            Assert.Equal(NodeState.SELECTED, required.State);
            Assert.NotEqual(NodeState.SELECTED, separateRequired.State);

            Assert.True(((IObjective)optional).TrySelectPossibility(fakeLinkToOptional));
            Assert.Equal(NodeState.SELECTED, possibilities[0].State);
            Assert.Equal(NodeState.DROPPED, possibilities[1].State);
            Assert.Equal(NodeState.SELECTED, optional.State);
            Assert.Equal(NodeState.SELECTED, required.State);
            Assert.Equal(NodeState.SELECTED, separateRequired.State);

            ((IObjective)optional).DeselectPossibility(fakeLinkToOptional);
            Assert.Equal(NodeState.SELECTED, possibilities[0].State);
            Assert.Equal(NodeState.DROPPED, possibilities[1].State);
            Assert.Equal(NodeState.UNKNOWN, optional.State);
            Assert.Empty(fakePossibility.DroppedFromObjectives);
            Assert.Equal(NodeState.SELECTED, required.State);
            Assert.NotEqual(NodeState.SELECTED, separateRequired.State);

            Assert.False(((IObjective)optional).TryDropPossibility(fakeLinkToOptional));
        }
Esempio n. 7
0
        public void CreateFullyConnected_NeedsMoreThanPossible_Throws(bool asConcrete)
        {
            int size          = 4;
            var puzzle        = new Puzzle(size);
            var matrix        = ExactCoverGraph.Create(puzzle);
            var possibilities = Possibilities.CreatePossibilities(new Coordinate(), 1);

            Assert.Single(possibilities);

            Assert.Throws <ArgumentException>(
                () =>
            {
                if (asConcrete)
                {
                    Objective.CreateFullyConnected(matrix, new ReadOnlySpan <Possibility>(possibilities), possibilities.Length + 1);
                }
                else
                {
                    Objective.CreateFullyConnected(matrix, new ReadOnlySpan <IPossibility>(possibilities), possibilities.Length + 1);
                }
            });
        }