static public double solve(List <Vectors> x, double[] a, ModelBase m) { int npts = x.Count; int n = a.GetLength(0); m.Normalise(a); // normalise P(0) double e0 = Objective(x, a, m); double lambda = lambda1; bool done = false; // g = gradient,H =hessian,d= step to min // H d = -g solve for d double [][] H = new double [n][]; //setup H for (int i = 0; i < n; i++) { H[i] = new double[n]; } // double[] g = new double[n]; int iter = 0; int term = 0; do { ++iter; // hessian approximation for (int r = 0; r < n; r++) { for (int c = 0; c < n; c++) { for (int i = 0; i < npts; i++) { if (i == 0) { H[r][c] = 0.0d; } H[r][c] += m.grad(x[i], a, r) * m.grad(x[i], a, c); } // for all points } } //set diagonal elements for (int r = 0; r < n; r++) { H[r][r] *= (1 + lambda); H[r][r] += lambda; } //gradient for (int r = 0; r < n; r++) { for (int i = 0; i < npts; i++) { if (i == 0) { g[r] = 0.0d; } g[r] = g[r] - m.DistLMA(x[i], a) * m.grad(x[i], a, r); } // for all points } Choleski ch = new Choleski(); double[] d = new double[a.GetLength(0)]; ch.solve(H, d, g); double[] na = new double[n]; for (int i = 0; i < n; i++) { na[i] = a[i] + d[i]; } m.Normalise(na); double e1 = Objective(x, na, m); if (Math.Abs(e1 - e0) > termepsilon) { term = 0; } else { term++; if (termepsilon == 4) { done = true; } } if (iter >= maxiter) { done = true; } if (e1 > e0) { lambda *= 10.0d; } else { lambda *= 0.04d; e0 = e1; for (int i = 0; i < n; i++) { a[i] = na[i]; } } }while (!done); return(lambda); }
private string CreateDeleteSql(ModelBase model, int id) { return(string.Format($"DELETE FROM {model.TableName} WHERE Id = {id}")); }
public void UpLoad(ModelBase modelBase) { ModelDic.Remove(modelBase.ModelName); }
public void Register(ModelBase modelBase) { ModelDic[modelBase.ModelName] = modelBase.GetType(); }