public static ReducedDualNumber Sqrt(ReducedDualNumber s)
 {
     double u = Math.Sqrt(s.value);
     return new ReducedDualNumber(u, s.gradient, 0.5 * s.multiplier / u);
 }
 static ReducedDualNumber()
 {
     // Used very often (e.g. in matrix initialization).
     zero = new ReducedDualNumber(0.0);
 }
 public static ReducedDualNumber Sqr(ReducedDualNumber s)
 {
     return new ReducedDualNumber(s.value * s.value, s.gradient, 2.0 * s.multiplier * s.value);
 }
 public static ReducedDualNumber Pow(ReducedDualNumber s, ReducedDualNumber t)
 {
     double u = Math.Pow(s.value, t.value);
     return new ReducedDualNumber(u, s.gradient, t.value * Math.Pow(s.value, t.value - 1.0) * s.multiplier, t.gradient, u * Math.Log(s.value) * t.multiplier);
 }
 public static ReducedDualNumber Pow(ReducedDualNumber s, double t)
 {
     return new ReducedDualNumber(Math.Pow(s.value, t), s.gradient, t * Math.Pow(s.value, t - 1.0) * s.multiplier);
 }
 public static ReducedDualNumber Log(ReducedDualNumber s)
 {
     return new ReducedDualNumber(Math.Log(s.value), s.gradient, s.multiplier / s.value);
 }
 public static ReducedDualNumber Exp(ReducedDualNumber s)
 {
     double u = Math.Exp(s.value);
     return new ReducedDualNumber(u, s.gradient, s.multiplier * u);
 }