Ejemplo n.º 1
0
        private bool LineSearchAndUpdateStepGradient(long msize, double[] x, bool orthant)
        {
            var size  = x.LongLength - 1;
            var bExit = false;

            mcsrch_.mcsrch(x, obj, v, w, ispt + point * size,
                           ref stp, ref info, ref nfev, diag);
            if (info == -1)
            {
                if (orthant == true)
                {
                    Parallel.For(1, size + 1, parallelOption, i =>
                    {
                        x[i] = (sigma(x[i]) == sigma(xi[i]) ? x[i] : 0);
                    });
                }


                iflag_ = 1;  // next value
                bExit  = true;
            }
            else if (info != 1)
            {
                //MCSRCH error, please see error code in info
                iflag_ = -1;
                bExit  = true;
            }
            else
            {
                // COMPUTE THE NEW STEP AND GRADIENT CHANGE
                npt = point * size;
                Parallel.For(1, size + 1, parallelOption, i =>
                {
                    w[ispt + npt + i] = (stp * w[ispt + npt + i]);
                    w[iypt + npt + i] = expected[i] - w[i];
                });

                ++point;
                if (point == msize)
                {
                    point = 0;
                }

                var gnorm = Math.Sqrt(ddot_(size, v, 1, v, 1));
                var xnorm = Math.Max(1.0, Math.Sqrt(ddot_(size, x, 1, x, 1)));
                if (gnorm / xnorm <= Utils.eps)
                {
                    iflag_ = 0;  // OK terminated
                    bExit  = true;
                }
            }

            return(bExit);
        }
Ejemplo n.º 2
0
        private bool LineSearchAndUpdateStepGradient(long msize, double[] x, bool orthant)
        {
            long size = x.LongLength - 1;
            bool bExit = false;
            mcsrch_.mcsrch(x, obj, v, w, ispt + point * size,
                            ref stp, ref info, ref nfev, diag);
            if (info == -1)
            {
                if (orthant == true)
                {
#if NO_SUPPORT_PARALLEL_LIB
                    for (long i = 1;i < size + 1;i++)
#else
                    Parallel.For(1, size + 1, parallelOption, i =>
#endif
                    {
                        x[i] = (sigma(x[i]) == sigma(xi[i]) ? x[i] : 0);
                    }
#if NO_SUPPORT_PARALLEL_LIB
#else
                    );
#endif
                }


                iflag_ = 1;  // next value
                bExit = true;
            }
            else if (info != 1)
            {
                //MCSRCH error, please see error code in info
                iflag_ = -1;
                bExit = true;
            }
            else
            {
                // COMPUTE THE NEW STEP AND GRADIENT CHANGE
                npt = point * size;

#if NO_SUPPORT_PARALLEL_LIB
                for (long i = 1;i < size + 1;i++)
#else
                Parallel.For(1, size + 1, parallelOption, i =>
#endif
                {
                    w[ispt + npt + i] = (stp * w[ispt + npt + i]);
                    w[iypt + npt + i] = expected[i] - w[i];
                }
#if NO_SUPPORT_PARALLEL_LIB
#else
                );
#endif

                ++point;
                if (point == msize)
                {
                    point = 0;
                }

                double gnorm = Math.Sqrt(ddot_(size, v, 1, v, 1));
                double xnorm = Math.Max(1.0, Math.Sqrt(ddot_(size, x, 1, x, 1)));
                if (gnorm / xnorm <= Utils.eps)
                {
                    iflag_ = 0;  // OK terminated
                    bExit = true;
                }
            }

            return bExit;
        }