void gradient(double[] parameters, double[] input, double[] result)
{
double m = parameters[0];
double s = parameters[1];
double a = parameters[2];
// double b = parameters[3]; // not needed
double x = input[0];
Func<double, double> exp = System.Math.Exp;
Func<double, double, double> pow = System.Math.Pow;
// diff a*exp(-0.5((m-x)/s)²) + b wrt m
result[0] = -(a * (m - x) * exp(-(0.5 * pow(m - x, 2)) / (s * s))) / (s * s);
//diff a*exp(-0.5((m-x)/s)²) + b wrt s
result[1] = (a * pow(m - x, 2) * exp(-(0.5 * pow(m - x, 2)) / (s * s))) / (s * s * s);
// diff a*exp(-0.5((m-x)/s)²) + b wrt a
result[2] = exp(-(0.5 * pow(x - m, 2)) / (s * s));
// diff a*exp(-0.5((m-x)/s)²) + b wrt b
result[3] = 1;
}