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); }
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; }