public void ResetCalculationState()
        {
            const double Increase = 0.5;
            const int Iterations = 10;

            var criterium = new DivergenceStopCriterium(Increase, Iterations);

            // Add residuals. Blow it up instantly
            var status = criterium.DetermineStatus(
                1,
                new DenseVector(new[] {1.0}),
                new DenseVector(new[] {1.0}),
                new DenseVector(new[] {double.NaN}));

            Assert.AreEqual(IterationStatus.Diverged, status, "Status check fail.");

            // Reset the state
            criterium.ResetToPrecalculationState();

            Assert.AreEqual(Increase, criterium.MaximumRelativeIncrease, "Incorrect maximum");
            Assert.AreEqual(Iterations, criterium.MinimumNumberOfIterations, "Incorrect iteration count");
            Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Status check fail.");
        }
        public void DetermineStatusWithTooFewIterations()
        {
            const double Increase = 0.5;
            const int Iterations = 10;

            var criterium = new DivergenceStopCriterium(Increase, Iterations);

            // Add residuals. We should not diverge because we'll have to few iterations
            for (var i = 0; i < Iterations - 1; i++)
            {
                var status = criterium.DetermineStatus(
                    i,
                    new DenseVector(new[] {1.0}),
                    new DenseVector(new[] {1.0}),
                    new DenseVector(new[] {(i + 1)*(Increase + 0.1)}));

                Assert.AreEqual(IterationStatus.Running, status, "Status check fail.");
            }
        }
        public void DetermineStatusWithNoDivergence()
        {
            const double Increase = 0.5;
            const int Iterations = 10;

            var criterium = new DivergenceStopCriterium(Increase, Iterations);

            // Add residuals. We should not diverge because we won't have enough increase
            for (var i = 0; i < Iterations*2; i++)
            {
                var status = criterium.DetermineStatus(
                    i,
                    new DenseVector(new[] {1.0}),
                    new DenseVector(new[] {1.0}),
                    new DenseVector(new[] {(i + 1)*(Increase - 0.01)}));

                Assert.AreEqual(IterationStatus.Running, status, "Status check fail.");
            }
        }
 public void DetermineStatusWithIllegalIterationNumberThrowsArgumentOutOfRangeException()
 {
     var criterium = new DivergenceStopCriterium(0.5, 15);
     Assert.Throws<ArgumentOutOfRangeException>(() => criterium.DetermineStatus(
         -1,
         DenseVector.Create(3, i => 4),
         DenseVector.Create(3, i => 5),
         DenseVector.Create(3, i => 6)));
 }
        public void DetermineStatusWithDivergenceThroughNaN()
        {
            const double Increase = 0.5;
            const int Iterations = 10;

            var criterium = new DivergenceStopCriterium(Increase, Iterations);

            // Add residuals. We should not diverge because we'll have to few iterations
            for (var i = 0; i < Iterations - 5; i++)
            {
                var status = criterium.DetermineStatus(
                    i,
                    new DenseVector(new[] {1.0}),
                    new DenseVector(new[] {1.0}),
                    new DenseVector(new[] {(i + 1)*(Increase - 0.01)}));

                Assert.AreEqual(IterationStatus.Running, status, "Status check fail.");
            }

            // Now make it fail by throwing in a NaN
            var status2 = criterium.DetermineStatus(
                Iterations,
                new DenseVector(new[] {1.0}),
                new DenseVector(new[] {1.0}),
                new DenseVector(new[] {double.NaN}));

            Assert.AreEqual(IterationStatus.Diverged, status2, "Status check fail.");
        }
        public void DetermineStatusWithDivergence()
        {
            const double Increase = 0.5;
            const int Iterations = 10;

            var criterium = new DivergenceStopCriterium(Increase, Iterations);

            // Add residuals. We should not diverge because we'll have one to few iterations
            double previous = 1;
            for (var i = 0; i < Iterations - 1; i++)
            {
                previous *= 1 + Increase + 0.01;
                var status = criterium.DetermineStatus(
                    i,
                    new DenseVector(new[] {1.0}),
                    new DenseVector(new[] {1.0}),
                    new DenseVector(new[] {previous}));

                Assert.AreEqual(IterationStatus.Running, status, "Status check fail.");
            }

            // Add the final residual. Now we should have divergence
            previous *= 1 + Increase + 0.01;
            var status2 = criterium.DetermineStatus(
                Iterations - 1,
                new DenseVector(new[] {1.0}),
                new DenseVector(new[] {1.0}),
                new DenseVector(new[] {previous}));

            Assert.AreEqual(IterationStatus.Diverged, status2, "Status check fail.");
        }