Beispiel #1
0
        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);
        }
Beispiel #2
0
 private string CreateDeleteSql(ModelBase model, int id)
 {
     return(string.Format($"DELETE FROM {model.TableName} WHERE Id = {id}"));
 }
Beispiel #3
0
 public void UpLoad(ModelBase modelBase)
 {
     ModelDic.Remove(modelBase.ModelName);
 }
Beispiel #4
0
 public void Register(ModelBase modelBase)
 {
     ModelDic[modelBase.ModelName] = modelBase.GetType();
 }