public void MomentumOptimizer_SimpleMultivar() { // arrange var func = new Mocks.SimpleMultivar(); var lr = 0.1D; var mu = 0.9D; var w = new double[2][] { new[] { 1.0D, 1.0D }, new[] { 1.0D } }; var optimizer = new MomentumOptimizer(mu); // act & assert optimizer.Push(w, func.Gradient(w), lr); Assert.AreEqual(0, w[0][0]); Assert.AreEqual(0.8, w[0][1]); Assert.AreEqual(0, w[1][0]); Assert.AreEqual(2.04, optimizer.Step2, EPS); optimizer.Push(w, func.Gradient(w), lr); Assert.AreEqual(-0.74, w[0][0], EPS); Assert.AreEqual(0.14, w[0][1], EPS); Assert.AreEqual(-0.74, w[1][0], EPS); Assert.AreEqual(1.5308, optimizer.Step2, EPS); optimizer.Push(w, func.Gradient(w), lr); Assert.AreEqual(-0.490, w[0][0], EPS); Assert.AreEqual(-0.834, w[0][1], EPS); Assert.AreEqual(-0.490, w[1][0], EPS); Assert.AreEqual(1.073676, optimizer.Step2, EPS); optimizer.Push(w, func.Gradient(w), lr); Assert.AreEqual(0.1562, w[0][0], EPS); Assert.AreEqual(-1.4062, w[0][1], EPS); Assert.AreEqual(0.1562, w[1][0], EPS); Assert.AreEqual(1.16256172, optimizer.Step2, EPS); optimizer.Push(w, func.Gradient(w), lr); Assert.AreEqual(0.2691, w[0][0], EPS); Assert.AreEqual(-1.01498, w[0][1], EPS); Assert.AreEqual(0.2691, w[1][0], EPS); Assert.AreEqual(0.17854591, optimizer.Step2, EPS); }