Esempio n. 1
0
        public void Gradient()
        {
            var f = new PiecewiseLinearFunction <double>(new List <IVector <double> >()
            {
                new Vector <double>(1d), new Vector <double>(2d)
            });

            var grad = f.Gradient(new Vector <double>(new[] { 0d, 0d, 3d, 3d, 10d, 10d }),
                                  new Vector <double>(0.5d));

            Assert.True(grad.Count == 6);
            Assert.True(grad.Skip(2).All(x => Math.Abs(x) < 1e-14));
            Assert.True(Math.Abs(grad[0] - 0.5) < 1e-14);
            Assert.True(Math.Abs(grad[1] - 1) < 1e-14);

            grad = f.Gradient(new Vector <double>(new[] { 0d, 0d, 3d, 3d, 10d, 10d }),
                              new Vector <double>(1.5d));

            Assert.True(grad.Count == 6);
            Assert.True(grad.Take(2).All(x => Math.Abs(x) < 1e-14));
            Assert.True(grad.TakeLast(2).All(x => Math.Abs(x) < 1e-14));
            Assert.True(Math.Abs(grad[2] - 1.5) < 1e-14);
            Assert.True(Math.Abs(grad[3] - 1) < 1e-14);

            grad = f.Gradient(new Vector <double>(new[] { 0d, 0d, 3d, 3d, 10d, 10d }),
                              new Vector <double>(3d));

            Assert.True(grad.Count == 6);
            Assert.True(grad.Take(4).All(x => Math.Abs(x) < 1e-14));
            Assert.True(Math.Abs(grad[4] - 3) < 1e-14);
            Assert.True(Math.Abs(grad[5] - 1) < 1e-14);

            grad = f.Gradient(new Vector <double>(new[] { 0d, 0d, 3d, 3d, 10d, 10d }),
                              new Vector <double>(2d));

            Assert.True(grad.Count == 6);
            Assert.True(grad.Count == 6);
            Assert.True(grad.Take(4).All(x => Math.Abs(x) < 1e-14));
            Assert.True(Math.Abs(grad[4] - 2) < 1e-14);
            Assert.True(Math.Abs(grad[5] - 1) < 1e-14);

            Assert.True(1e-14 > 6 - f.Value(new Vector <double>(new[] { 0d, 0d, 3d, 3d, 10d, 10d }),
                                            new Vector <double>(new[] { 1d })));

            grad = f.Gradient(new Vector <double>(new[] { 0d, 0d, 3d, 3d, 10d, 10d }),
                              new Vector <double>(1.5d));

            Assert.True(grad.Count == 6);
            Assert.True(grad.Take(2).All(x => Math.Abs(x) < 1e-14));
            Assert.True(grad.TakeLast(2).All(x => Math.Abs(x) < 1e-14));
            Assert.True(Math.Abs(grad[2] - 1.5) < 1e-14);
            Assert.True(Math.Abs(grad[3] - 1) < 1e-14);
        }