13int slsqp_(
int *
m,
int *meq,
const int *la,
int *
n,
double *
x,
double *xl,
double *xu,
const double *f,
double *c__,
14 double *g,
double *a,
double *acc,
int *iter,
int *mode,
double *w,
const int *l_w__,
int *jw,
30 int la = std::max(1,
m);
33 std::vector<double>
x = x0;
34 std::vector<double> xl(
n, -1e12), xu(
n, 1e12);
38 std::vector<double> constraintValues(
m, 0.0);
41 std::vector<double> gradient(
m_nparams + 1, 0.0);
49 int mineq =
m - meq + n1 + n1;
50 int len_w = (3 * n1 +
m) * (n1 + 1) + (n1 - meq + 1) * (mineq + 2) + 2 * mineq + (n1 + mineq) * (n1 - meq) + 2 * meq +
51 n1 + (
n + 1) *
n / 2 + 2 *
m + 3 *
n + 3 * n1 + 1;
53 std::vector<double> vec_w(len_w, 0.0);
54 double *w = vec_w.data();
55 std::vector<int> vec_jw(len_jw, 0);
56 int *jw = vec_jw.data();
59 if (mode == 0 || mode == 1)
65 if (mode == 0 || mode == -1)
71 slsqp_(&
m, &meq, &la, &
n,
x.data(), xl.data(), xu.data(), &fx, constraintValues.data(), gradient.data(),
75 if (mode != 1 && mode != -1)
89 const double epsilon(1e-08);
92 std::vector<double>
tmp =
x;
95 const double curx = xi;
111 const size_t numConstrs(constrValues.size());
112 for (
size_t i = 0; i < numConstrs; ++i) {
117 constrValues[i] =
value;
132 if (totalNumConstr == 0)
136 for (
size_t i = 0; i < 2; ++i) {
144 matrix =
"inequality";
148 std::ostringstream os;
149 os <<
"SLSQPMinimizer::initializeConstraints - Invalid " << matrix
150 <<
" constraint matrix. Number of columns must match number of "
153 throw std::invalid_argument(os.str());
165 const size_t constrVecSize = totalNumConstr *
numParameters() + totalNumConstr;
168 size_t constrCounter(0);
169 while (constrCounter < totalNumConstr) {
172 constrMatrix = &equality;
174 constrMatrix = &inequality;
176 for (
size_t i = 0; i < constrMatrix->
numRows(); ++i, ++constrCounter) {
177 const auto matrixRow = (*constrMatrix)[i];
178 for (
size_t j = 0; j < constrMatrix->
numCols(); ++j) {
183 assert(totalNumConstr == constrCounter);
212double d_sign(
const double *a,
const double *b) {
214 x = (*a >= 0 ? *a : -*a);
215 return (*b >= 0 ?
x : -
x);
219int slsqpb_(
int * ,
int * ,
const int * ,
int * ,
double * ,
double * ,
220 double * ,
const double * ,
double * ,
double * ,
double * ,
double * ,
221 int * ,
int * ,
double * ,
double * ,
double * ,
double * ,
222 double * ,
double * ,
double * ,
double * ,
int * );
223int dcopy___(
const int *
n,
double const *dx,
const int *incx,
double *dy,
const int *incy);
224int daxpy_sl__(
const int *
n,
const double *da,
double const *dx,
const int *incx,
double *dy,
const int *incy);
225int lsq_(
int *
m,
int *meq,
int *
n,
const int *nl,
const int *la,
double *l,
double const *g,
double *a,
double *b,
226 double *xl,
double *xu,
double *
x,
double *
y,
double *w,
int *jw,
int *mode);
227double ddot_sl__(
const int *
n,
double const *dx,
const int *incx,
double const *dy,
const int *incy);
228int dscal_sl__(
const int *
n,
const double *da,
double *dx,
const int *incx);
229double linmin_(
int *mode,
const double *ax,
const double *bx,
const double *f,
const double *tol);
230double dnrm2___(
const int *
n,
double const *dx,
const int *incx);
231int ldl_(
const int *
n,
double *a,
double *z__,
const double *
sigma,
double *w);
232int lsei_(
double *c__,
double *d__,
double *e,
double *f,
double *g,
double *h__,
const int *lc,
const int *mc,
233 const int *le,
const int *me,
const int *lg,
const int *mg,
const int *
n,
double *
x,
double *xnrm,
double *w,
235int h12_(
const int *mode,
const int *lpivot,
const int *l1,
const int *
m,
double *u,
const int *iue,
double *up,
236 double *c__,
const int *ice,
const int *icv,
const int *ncv);
237int hfti_(
double *a,
const int *mda,
const int *
m,
const int *
n,
double *b,
const int *mdb,
const int *nb,
238 const double *tau,
int *krank,
double *rnorm,
double *h__,
double *g,
int *ip);
239int lsi_(
double *e,
double *f,
double *g,
double *h__,
const int *le,
const int *me,
const int *lg,
const int *mg,
240 const int *
n,
double *
x,
double *xnorm,
double *w,
int *jw,
int *mode);
241int ldp_(
double *g,
const int *mg,
const int *
m,
const int *
n,
double *h__,
double *
x,
double *xnorm,
double *w,
242 int *
index,
int *mode);
243int nnls_(
double *a,
const int *mda,
const int *
m,
const int *
n,
double *b,
double *
x,
double *rnorm,
double *w,
244 double *z__,
int *
index,
int *mode);
245int dsrotg_(
double *da,
double *db,
double *c__,
double *s);
246int dsrot_(
const int *
n,
double *dx,
const int *incx,
double *dy,
const int *incy,
const double *c__,
const double *s);
282int slsqp_(
int *
m,
int *meq,
const int *la,
int *
n,
double *
x,
double *xl,
double *xu,
const double *f,
double *c__,
283 double *g,
double *a,
double *acc,
int *iter,
int *mode,
double *w,
const int *l_w__,
int *jw,
286 int a_dim1, a_offset, i__1, i__2;
289 static int n1, il, im, ir, is, iu, iv, iw, ix, mineq;
472 a_offset = 1 + a_dim1;
483 mineq = *
m - *meq + n1 + n1;
484 il = (n1 * 3 + *
m) * (n1 + 1) + (n1 - *meq + 1) * (mineq + 2) + (mineq << 1) + (n1 + mineq) * (n1 - *meq) +
485 (*meq << 1) + n1 * *
n / 2 + (*
m << 1) + *
n * 3 + (n1 << 2) + 1;
487 i__1 = mineq, i__2 = n1 - *meq;
488 im = std::max(i__1, i__2);
489 if (*l_w__ < il || *l_jw__ < im) {
490 *mode = std::max(10, il) * 1000;
491 *mode += std::max(10, im);
496 il = im + std::max(1, *
m);
498 ix = il + n1 * *
n / 2 + 1;
500 is = ir + *
n + *
n + std::max(1, *
m);
501 is = ir + *
n + *
n + *la;
506 slsqpb_(
m, meq, la,
n, &
x[1], &xl[1], &xu[1], f, &c__[1], &g[1], &a[a_offset], acc, iter, mode, &w[ir], &w[il],
507 &w[ix], &w[im], &w[is], &w[iu], &w[iv], &w[iw], &jw[1]);
511int slsqpb_(
int *
m,
int *meq,
const int *la,
int *
n,
double *
x,
double *xl,
double *xu,
const double *f,
double *c__,
512 double *g,
double *a,
double *acc,
int *iter,
int *mode,
double *r__,
double *l,
double *x0,
double *
mu,
513 double *s,
double *u,
double *v,
double *w,
int *iw) {
516 static double zero = 0.;
517 static double one = 1.;
518 static double alfmin = .1;
519 static double hun = 100.;
520 static double ten = 10.;
521 static double two = 2.;
524 int a_dim1, a_offset, i__1, i__2;
528 static int i__, j, k;
529 static double t, f0, h1, h2, h3, h4;
530 static int n1, n2, n3;
531 static double t0, gs;
536 static int incons, ireset, itermx;
555 a_offset = 1 + a_dim1;
567 }
else if (*mode == 0) {
579 *acc = std::abs(*acc);
588 dcopy___(
n, &s[1], &c__0, &s[1], &c__1);
589 dcopy___(
m, &
mu[1], &c__0, &
mu[1], &c__1);
597 dcopy___(&n2, &l[1], &c__0, &l[1], &c__1);
600 for (i__ = 1; i__ <= i__1; ++i__) {
609 if (*iter > itermx) {
613 dcopy___(
n, &xl[1], &c__1, &u[1], &c__1);
614 dcopy___(
n, &xu[1], &c__1, &v[1], &c__1);
616 daxpy_sl__(
n, &d__1, &
x[1], &c__1, &u[1], &c__1);
618 daxpy_sl__(
n, &d__1, &
x[1], &c__1, &v[1], &c__1);
620 lsq_(
m, meq,
n, &n3, la, &l[1], &g[1], &a[a_offset], &c__[1], &u[1], &v[1], &s[1], &r__[1], &w[1], &iw[1], mode);
629 for (j = 1; j <= i__1; ++j) {
631 a[j + n1 * a_dim1] = -c__[j];
635 a[j + n1 * a_dim1] = std::max(d__1, zero);
640 dcopy___(
n, &s[1], &c__0, &s[1], &c__1);
649 lsq_(
m, meq, &n1, &n3, la, &l[1], &g[1], &a[a_offset], &c__[1], &u[1], &v[1], &s[1], &r__[1], &w[1], &iw[1], mode);
658 }
else if (*mode != 1) {
661 }
else if (*mode != 1) {
666 for (i__ = 1; i__ <= i__1; ++i__) {
667 v[i__] = g[i__] - ddot_sl__(
m, &a[i__ * a_dim1 + 1], &c__1, &r__[1], &c__1);
671 dcopy___(
n, &
x[1], &c__1, &x0[1], &c__1);
672 gs = ddot_sl__(
n, &g[1], &c__1, &s[1], &c__1);
676 for (j = 1; j <= i__1; ++j) {
684 h2 += std::max(d__1, h3);
685 h3 = (d__1 = r__[j], std::abs(d__1));
687 d__1 = h3, d__2 = (
mu[j] + h3) / two;
688 mu[j] = std::max(d__1, d__2);
689 h1 += h3 * (d__1 = c__[j], std::abs(d__1));
694 if (h1 < *acc && h2 < *acc) {
699 for (j = 1; j <= i__1; ++j) {
707 h1 +=
mu[j] * std::max(d__1, h3);
726 dscal_sl__(
n, &alpha, &s[1], &c__1);
727 dcopy___(
n, &x0[1], &c__1, &
x[1], &c__1);
728 daxpy_sl__(
n, &one, &s[1], &c__1, &
x[1], &c__1);
732 if (h1 <= h3 / ten || line > 10) {
736 d__1 = h3 / (two * (h3 - h1));
737 alpha = std::max(d__1, alfmin);
742 alpha = linmin_(&line, &alfmin, &one, &t, &tol);
743 dcopy___(
n, &x0[1], &c__1, &
x[1], &c__1);
744 daxpy_sl__(
n, &alpha, &s[1], &c__1, &
x[1], &c__1);
748 dscal_sl__(
n, &alpha, &s[1], &c__1);
754 for (j = 1; j <= i__1; ++j) {
762 t +=
mu[j] * std::max(d__1, h1);
766 switch (iexact + 1) {
776 for (j = 1; j <= i__1; ++j) {
784 h3 += std::max(d__1, h1);
787 if (((d__1 = *f - f0, std::abs(d__1)) < *acc || dnrm2___(
n, &s[1], &c__1) < *acc) && h3 < *acc) {
795 if (((d__1 = *f - f0, std::abs(d__1)) < tol || dnrm2___(
n, &s[1], &c__1) < tol) && h3 < tol) {
805 for (i__ = 1; i__ <= i__1; ++i__) {
806 u[i__] = g[i__] - ddot_sl__(
m, &a[i__ * a_dim1 + 1], &c__1, &r__[1], &c__1) - v[i__];
811 for (i__ = 1; i__ <= i__1; ++i__) {
815 for (j = i__ + 1; j <= i__2; ++j) {
820 v[i__] = s[i__] + h1;
825 for (i__ = 1; i__ <= i__1; ++i__) {
826 v[i__] = l[k] * v[i__];
831 for (i__ = *
n; i__ >= 1; --i__) {
835 for (j = 1; j <= i__1; ++j) {
843 h1 = ddot_sl__(
n, &s[1], &c__1, &u[1], &c__1);
844 h2 = ddot_sl__(
n, &s[1], &c__1, &v[1], &c__1);
847 h4 = (h2 - h3) / (h2 - h1);
849 dscal_sl__(
n, &h4, &u[1], &c__1);
851 daxpy_sl__(
n, &d__1, &v[1], &c__1, &u[1], &c__1);
854 ldl_(
n, &l[1], &u[1], &d__1, &v[1]);
856 ldl_(
n, &l[1], &v[1], &d__1, &u[1]);
864int lsq_(
int *
m,
int *meq,
int *
n,
const int *nl,
const int *la,
double *l,
double const *g,
double *a,
double *b,
865 double *xl,
double *xu,
double *
x,
double *
y,
double *w,
int *jw,
int *mode) {
868 static double zero = 0.;
869 static double one = 1.;
872 int a_dim1, a_offset, i__1, i__2;
876 static int i__, i1, i2, i3, i4, m1, n1, n2, n3, ic, id, ie, if__, ig, ih, il, im, ip, iu, iw;
924 a_offset = 1 + a_dim1;
932 m1 = mineq + *
n + *
n;
936 n2 = n1 * *
n / 2 + 1;
950 for (i__ = 1; i__ <= i__1; ++i__) {
954 dcopy___(&i1, &w[i3], &c__0, &w[i3], &c__1);
956 dcopy___(&i__2, &l[i2], &c__1, &w[i3],
n);
958 dscal_sl__(&i__2, &diag, &w[i3],
n);
961 w[if__ - 1 + i__] = (g[i__] - ddot_sl__(&i__2, &w[i4], &c__1, &w[if__], &c__1)) / diag;
970 dcopy___(&n3, &w[i4], &c__0, &w[i4], &c__1);
971 w[if__ - 1 + *
n] = zero;
974 dscal_sl__(
n, &d__1, &w[if__], &c__1);
980 for (i__ = 1; i__ <= i__1; ++i__) {
981 dcopy___(
n, &a[i__ + a_dim1], la, &w[ic - 1 + i__], meq);
985 dcopy___(meq, &b[1], &c__1, &w[
id], &c__1);
987 dscal_sl__(meq, &d__1, &w[
id], &c__1);
993 for (i__ = 1; i__ <= i__1; ++i__) {
994 dcopy___(
n, &a[*meq + i__ + a_dim1], la, &w[ig - 1 + i__], &m1);
1001 for (i__ = 1; i__ <= i__1; ++i__) {
1002 w[ip - 1 + i__] = zero;
1003 dcopy___(
n, &w[ip - 1 + i__], &c__0, &w[ip - 1 + i__], &m1);
1008 dcopy___(
n, &w[ip], &c__0, &w[ip], &i__1);
1011 for (i__ = 1; i__ <= i__1; ++i__) {
1012 w[im - 1 + i__] = zero;
1013 dcopy___(
n, &w[im - 1 + i__], &c__0, &w[im - 1 + i__], &m1);
1018 dcopy___(
n, &w[im], &c__0, &w[im], &i__1);
1022 dcopy___(&mineq, &b[*meq + 1], &c__1, &w[ih], &c__1);
1024 dscal_sl__(&mineq, &d__1, &w[ih], &c__1);
1028 dcopy___(
n, &xl[1], &c__1, &w[il], &c__1);
1030 dcopy___(
n, &xu[1], &c__1, &w[iu], &c__1);
1032 dscal_sl__(
n, &d__1, &w[iu], &c__1);
1034 i__1 = std::max(1, *meq);
1035 lsei_(&w[ic], &w[
id], &w[ie], &w[if__], &w[ig], &w[ih], &i__1, meq,
n,
n, &m1, &m1,
n, &
x[1], &xnorm, &w[iw], &jw[1],
1039 dcopy___(
m, &w[iw], &c__1, &
y[1], &c__1);
1040 dcopy___(&n3, &w[iw + *
m], &c__1, &
y[*
m + 1], &c__1);
1041 dcopy___(&n3, &w[iw + *
m + *
n], &c__1, &
y[*
m + n3 + 1], &c__1);
1047int lsei_(
double *c__,
double *d__,
double *e,
double *f,
double *g,
double *h__,
const int *lc,
const int *mc,
1048 const int *le,
const int *me,
const int *lg,
const int *mg,
const int *
n,
double *
x,
double *xnrm,
double *w,
1049 int *jw,
int *mode) {
1052 static double epmach = 2.22e-16;
1053 static double zero = 0.;
1056 int c_dim1, c_offset, e_dim1, e_offset, g_dim1, g_offset, i__1, i__2, i__3;
1060 static int i__, j, k, l;
1062 static int ie, if__, ig, iw, mc1;
1107 g_offset = 1 + g_dim1;
1110 e_offset = 1 + e_dim1;
1113 c_offset = 1 + c_dim1;
1125 iw = (l + 1) * (*mg + 2) + (*mg << 1) + *mc;
1127 if__ = ie + *me * l;
1131 for (i__ = 1; i__ <= i__1; ++i__) {
1134 j = std::min(i__2, *lc);
1137 h12_(&c__1, &i__, &i__2,
n, &c__[i__ + c_dim1], lc, &w[iw + i__], &c__[j + c_dim1], lc, &c__1, &i__3);
1139 h12_(&c__2, &i__, &i__2,
n, &c__[i__ + c_dim1], lc, &w[iw + i__], &e[e_offset], le, &c__1, me);
1142 h12_(&c__2, &i__, &i__2,
n, &c__[i__ + c_dim1], lc, &w[iw + i__], &g[g_offset], lg, &c__1, mg);
1147 for (i__ = 1; i__ <= i__2; ++i__) {
1148 if ((d__1 = c__[i__ + i__ * c_dim1], std::abs(d__1)) < epmach) {
1152 x[i__] = (d__[i__] - ddot_sl__(&i__1, &c__[i__ + c_dim1], lc, &
x[1], &c__1)) / c__[i__ + i__ * c_dim1];
1158 dcopy___(&i__2, &w[mc1], &c__0, &w[mc1], &c__1);
1163 for (i__ = 1; i__ <= i__2; ++i__) {
1165 w[if__ - 1 + i__] = f[i__] - ddot_sl__(mc, &e[i__ + e_dim1], le, &
x[1], &c__1);
1169 for (i__ = 1; i__ <= i__2; ++i__) {
1171 dcopy___(&l, &e[i__ + mc1 * e_dim1], le, &w[ie - 1 + i__], me);
1174 for (i__ = 1; i__ <= i__2; ++i__) {
1176 dcopy___(&l, &g[i__ + mc1 * g_dim1], lg, &w[ig - 1 + i__], mg);
1183 k = std::max(*le, *
n);
1185 hfti_(&w[ie], me, me, &l, &w[if__], &k, &c__1, &t, &krank, xnrm, &w[1], &w[l + 1], &jw[1]);
1186 dcopy___(&l, &w[if__], &c__1, &
x[mc1], &c__1);
1195 for (i__ = 1; i__ <= i__2; ++i__) {
1197 h__[i__] -= ddot_sl__(mc, &g[i__ + g_dim1], lg, &
x[1], &c__1);
1199 lsi_(&w[ie], &w[if__], &w[ig], &h__[1], me, me, mg, mg, &l, &
x[mc1], xnrm, &w[mc1], &jw[1], mode);
1203 t = dnrm2___(mc, &
x[1], &c__1);
1204 *xnrm = sqrt(*xnrm * *xnrm + t * t);
1211 for (i__ = 1; i__ <= i__2; ++i__) {
1213 f[i__] = ddot_sl__(
n, &e[i__ + e_dim1], le, &
x[1], &c__1) - f[i__];
1216 for (i__ = 1; i__ <= i__2; ++i__) {
1218 d__[i__] = ddot_sl__(me, &e[i__ * e_dim1 + 1], &c__1, &f[1], &c__1) -
1219 ddot_sl__(mg, &g[i__ * g_dim1 + 1], &c__1, &w[mc1], &c__1);
1221 for (i__ = *mc; i__ >= 1; --i__) {
1224 h12_(&c__2, &i__, &i__2,
n, &c__[i__ + c_dim1], lc, &w[iw + i__], &
x[1], &c__1, &c__1, &c__1);
1226 for (i__ = *mc; i__ >= 1; --i__) {
1229 j = std::min(i__2, *lc);
1231 w[i__] = (d__[i__] - ddot_sl__(&i__2, &c__[j + i__ * c_dim1], &c__1, &w[j], &c__1)) / c__[i__ + i__ * c_dim1];
1239int lsi_(
double *e,
double *f,
double *g,
double *h__,
const int *le,
const int *me,
const int *lg,
const int *mg,
1240 const int *
n,
double *
x,
double *xnorm,
double *w,
int *jw,
int *mode) {
1243 static double epmach = 2.22e-16;
1244 static double one = 1.;
1247 int e_dim1, e_offset, g_dim1, g_offset, i__1, i__2, i__3;
1290 g_offset = 1 + g_dim1;
1293 e_offset = 1 + e_dim1;
1300 for (i__ = 1; i__ <= i__1; ++i__) {
1303 j = std::min(i__2, *
n);
1306 h12_(&c__1, &i__, &i__2, me, &e[i__ * e_dim1 + 1], &c__1, &t, &e[j * e_dim1 + 1], &c__1, le, &i__3);
1309 h12_(&c__2, &i__, &i__2, me, &e[i__ * e_dim1 + 1], &c__1, &t, &f[1], &c__1, &c__1, &c__1);
1314 for (i__ = 1; i__ <= i__2; ++i__) {
1316 for (j = 1; j <= i__1; ++j) {
1317 if ((d__1 = e[j + j * e_dim1], std::abs(d__1)) < epmach) {
1322 g[i__ + j * g_dim1] =
1323 (g[i__ + j * g_dim1] - ddot_sl__(&i__3, &g[i__ + g_dim1], lg, &e[j * e_dim1 + 1], &c__1)) / e[j + j * e_dim1];
1326 h__[i__] -= ddot_sl__(
n, &g[i__ + g_dim1], lg, &f[1], &c__1);
1329 ldp_(&g[g_offset], lg, mg,
n, &h__[1], &
x[1], xnorm, &w[1], &jw[1], mode);
1334 daxpy_sl__(
n, &one, &f[1], &c__1, &
x[1], &c__1);
1335 for (i__ = *
n; i__ >= 1; --i__) {
1338 j = std::min(i__2, *
n);
1341 x[i__] = (
x[i__] - ddot_sl__(&i__2, &e[i__ + j * e_dim1], le, &
x[j], &c__1)) / e[i__ + i__ * e_dim1];
1345 j = std::min(i__2, *me);
1347 t = dnrm2___(&i__2, &f[j], &c__1);
1348 *xnorm = sqrt(*xnorm * *xnorm + t * t);
1354int ldp_(
double *g,
const int *mg,
const int *
m,
const int *
n,
double *h__,
double *
x,
double *xnorm,
double *w,
1355 int *
index,
int *mode) {
1358 static double zero = 0.;
1359 static double one = 1.;
1362 int g_dim1, g_offset, i__1, i__2;
1366 static int i__, j, n1, if__, iw, iy, iz;
1368 static double rnorm;
1404 g_offset = 1 + g_dim1;
1416 dcopy___(
n, &
x[1], &c__0, &
x[1], &c__1);
1423 for (j = 1; j <= i__1; ++j) {
1425 for (i__ = 1; i__ <= i__2; ++i__) {
1428 w[iw] = g[j + i__ * g_dim1];
1436 for (i__ = 1; i__ <= i__1; ++i__) {
1447 nnls_(&w[1], &n1, &n1,
m, &w[if__], &w[iy], &rnorm, &w[iwdual], &w[iz], &
index[1], mode);
1452 if (rnorm <= zero) {
1456 fac = one - ddot_sl__(
m, &h__[1], &c__1, &w[iy], &c__1);
1458 if (d__1 - one <= zero) {
1464 for (j = 1; j <= i__1; ++j) {
1466 x[j] = fac * ddot_sl__(
m, &g[j * g_dim1 + 1], &c__1, &w[iy], &c__1);
1468 *xnorm = dnrm2___(
n, &
x[1], &c__1);
1471 dcopy___(
m, &w[1], &c__0, &w[1], &c__1);
1472 daxpy_sl__(
m, &fac, &w[iy], &c__1, &w[1], &c__1);
1478int nnls_(
double *a,
const int *mda,
const int *
m,
const int *
n,
double *b,
double *
x,
double *rnorm,
double *w,
1479 double *z__,
int *
index,
int *mode) {
1482 static double zero = 0.;
1483 static double one = 1.;
1484 static double factor = .01;
1487 int a_dim1, a_offset, i__1, i__2;
1492 static int i__, j, k, l;
1494 static int ii, jj, ip, iz, jz;
1496 static int iz1, iz2, npp1, iter;
1497 static double wmax, alpha, asave;
1498 static int itmax, izmax, nsetp;
1499 static double unorm;
1544 a_offset = 1 + a_dim1;
1550 if (*
m <= 0 || *
n <= 0) {
1558 for (i__ = 1; i__ <= i__1; ++i__) {
1567 dcopy___(
n, &
x[1], &c__0, &
x[1], &c__1);
1571 if (iz1 > iz2 || nsetp >= *
m) {
1575 for (iz = iz1; iz <= i__1; ++iz) {
1579 w[j] = ddot_sl__(&i__2, &a[npp1 + j * a_dim1], &c__1, &b[npp1], &c__1);
1585 for (iz = iz1; iz <= i__2; ++iz) {
1601 asave = a[npp1 + j * a_dim1];
1603 h12_(&c__1, &npp1, &i__2,
m, &a[j * a_dim1 + 1], &c__1, &up, &z__[1], &c__1, &c__1, &c__0);
1604 unorm = dnrm2___(&nsetp, &a[j * a_dim1 + 1], &c__1);
1605 t = factor * (d__1 = a[npp1 + j * a_dim1], std::abs(d__1));
1607 if (d__1 - unorm <= zero) {
1610 dcopy___(
m, &b[1], &c__1, &z__[1], &c__1);
1612 h12_(&c__2, &npp1, &i__2,
m, &a[j * a_dim1 + 1], &c__1, &up, &z__[1], &c__1, &c__1, &c__1);
1613 if (z__[npp1] / a[npp1 + j * a_dim1] > zero) {
1617 a[npp1 + j * a_dim1] = asave;
1622 dcopy___(
m, &z__[1], &c__1, &b[1], &c__1);
1629 for (jz = iz1; jz <= i__2; ++jz) {
1632 h12_(&c__2, &nsetp, &npp1,
m, &a[j * a_dim1 + 1], &c__1, &up, &a[jj * a_dim1 + 1], &c__1, mda, &c__1);
1634 k = std::min(npp1, *mda);
1637 dcopy___(&i__2, &w[j], &c__0, &a[k + j * a_dim1], &c__1);
1641 for (ip = nsetp; ip >= 1; --ip) {
1645 d__1 = -z__[ip + 1];
1646 daxpy_sl__(&ip, &d__1, &a[jj * a_dim1 + 1], &c__1, &z__[1], &c__1);
1650 z__[ip] /= a[ip + jj * a_dim1];
1653 if (iter <= itmax) {
1664 for (ip = 1; ip <= i__2; ++ip) {
1665 if (z__[ip] > zero) {
1669 t = -
x[l] / (z__[ip] -
x[l]);
1678 for (ip = 1; ip <= i__2; ++ip) {
1681 x[l] = (one - alpha) *
x[l] + alpha * z__[ip];
1693 for (j = jj; j <= i__2; ++j) {
1696 dsrotg_(&a[j - 1 + ii * a_dim1], &a[j + ii * a_dim1], &c__, &s);
1697 t = a[j - 1 + ii * a_dim1];
1698 dsrot_(
n, &a[j - 1 + a_dim1], mda, &a[j + a_dim1], mda, &c__, &s);
1699 a[j - 1 + ii * a_dim1] = t;
1700 a[j + ii * a_dim1] = zero;
1702 dsrot_(&c__1, &b[j - 1], &c__1, &b[j], &c__1, &c__, &s);
1712 for (jj = 1; jj <= i__2; ++jj) {
1714 if (
x[i__] <= zero) {
1719 dcopy___(
m, &b[1], &c__1, &z__[1], &c__1);
1723 k = std::min(npp1, *
m);
1725 *rnorm = dnrm2___(&i__2, &b[k], &c__1);
1728 dcopy___(
n, &w[1], &c__0, &w[1], &c__1);
1735int hfti_(
double *a,
const int *mda,
const int *
m,
const int *
n,
double *b,
const int *mdb,
const int *nb,
1736 const double *tau,
int *krank,
double *rnorm,
double *h__,
double *g,
int *ip) {
1739 static double zero = 0.;
1740 static double factor = .001;
1743 int a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3;
1747 static int i__, j, k, l;
1749 static double tmp, hmax;
1750 static int lmax, ldiag;
1784 a_offset = 1 + a_dim1;
1788 b_offset = 1 + b_dim1;
1793 ldiag = std::min(*
m, *
n);
1799 for (j = 1; j <= i__1; ++j) {
1805 for (l = j; l <= i__2; ++l) {
1807 d__1 = a[j - 1 + l * a_dim1];
1808 h__[l] -= d__1 * d__1;
1810 if (h__[l] > h__[lmax]) {
1814 d__1 = hmax + factor * h__[lmax];
1815 if (d__1 - hmax > zero) {
1821 for (l = j; l <= i__2; ++l) {
1824 for (i__ = j; i__ <= i__3; ++i__) {
1827 d__1 = a[i__ + l * a_dim1];
1828 h__[l] += d__1 * d__1;
1831 if (h__[l] > h__[lmax]) {
1843 for (i__ = 1; i__ <= i__2; ++i__) {
1844 tmp = a[i__ + j * a_dim1];
1845 a[i__ + j * a_dim1] = a[i__ + lmax * a_dim1];
1847 a[i__ + lmax * a_dim1] =
tmp;
1854 i__ = std::min(i__2, *
n);
1857 h12_(&c__1, &j, &i__2,
m, &a[j * a_dim1 + 1], &c__1, &h__[j], &a[i__ * a_dim1 + 1], &c__1, mda, &i__3);
1860 h12_(&c__2, &j, &i__2,
m, &a[j * a_dim1 + 1], &c__1, &h__[j], &b[b_offset], &c__1, mdb, nb);
1864 for (j = 1; j <= i__2; ++j) {
1866 if ((d__1 = a[j + j * a_dim1], std::abs(d__1)) <= *tau) {
1878 for (jb = 1; jb <= i__2; ++jb) {
1881 rnorm[jb] = dnrm2___(&i__1, &b[kp1 + jb * b_dim1], &c__1);
1887 for (jb = 1; jb <= i__1; ++jb) {
1889 for (i__ = 1; i__ <= i__2; ++i__) {
1891 b[i__ + jb * b_dim1] = zero;
1900 for (i__ = k; i__ >= 1; --i__) {
1903 h12_(&c__1, &i__, &kp1,
n, &a[i__ + a_dim1], mda, &g[i__], &a[a_offset], mda, &c__1, &i__2);
1907 for (jb = 1; jb <= i__2; ++jb) {
1909 for (i__ = k; i__ >= 1; --i__) {
1912 j = std::min(i__1, *
n);
1915 b[i__ + jb * b_dim1] =
1916 (b[i__ + jb * b_dim1] - ddot_sl__(&i__1, &a[i__ + j * a_dim1], mda, &b[j + jb * b_dim1], &c__1)) /
1917 a[i__ + i__ * a_dim1];
1924 for (j = kp1; j <= i__1; ++j) {
1926 b[j + jb * b_dim1] = zero;
1929 for (i__ = 1; i__ <= i__1; ++i__) {
1931 h12_(&c__2, &i__, &kp1,
n, &a[i__ + a_dim1], mda, &g[i__], &b[jb * b_dim1 + 1], &c__1, mdb, &c__1);
1935 for (j = ldiag; j >= 1; --j) {
1940 tmp = b[l + jb * b_dim1];
1941 b[l + jb * b_dim1] = b[j + jb * b_dim1];
1942 b[j + jb * b_dim1] =
tmp;
1951int h12_(
const int *mode,
const int *lpivot,
const int *l1,
const int *
m,
double *u,
const int *iue,
double *up,
1952 double *c__,
const int *ice,
const int *icv,
const int *ncv) {
1955 static double one = 1.;
1956 static double zero = 0.;
1959 int u_dim1, u_offset, i__1, i__2;
1964 static int i__, j, i2, i3, i4;
1965 static double cl, sm;
1967 static double clinv;
1996 u_offset = 1 + u_dim1;
2001 if (0 >= *lpivot || *lpivot >= *l1 || *l1 > *
m) {
2004 cl = (d__1 = u[*lpivot * u_dim1 + 1], std::abs(d__1));
2010 for (j = *l1; j <= i__1; ++j) {
2011 sm = (d__1 = u[j * u_dim1 + 1], std::abs(d__1));
2013 cl = std::max(sm, cl);
2020 d__1 = u[*lpivot * u_dim1 + 1] * clinv;
2023 for (j = *l1; j <= i__1; ++j) {
2026 d__1 = u[j * u_dim1 + 1] * clinv;
2030 if (u[*lpivot * u_dim1 + 1] > zero) {
2033 *up = u[*lpivot * u_dim1 + 1] - cl;
2034 u[*lpivot * u_dim1 + 1] = cl;
2045 b = *up * u[*lpivot * u_dim1 + 1];
2050 i2 = 1 - *icv + *ice * (*lpivot - 1);
2051 incr = *ice * (*l1 - *lpivot);
2053 for (j = 1; j <= i__1; ++j) {
2059 for (i__ = *l1; i__ <= i__2; ++i__) {
2060 sm += c__[i3] * u[i__ * u_dim1 + 1];
2068 c__[i2] += sm * *up;
2070 for (i__ = *l1; i__ <= i__2; ++i__) {
2071 c__[i4] += sm * u[i__ * u_dim1 + 1];
2081int ldl_(
const int *
n,
double *a,
double *z__,
const double *
sigma,
double *w) {
2084 static double zero = 0.;
2085 static double one = 1.;
2086 static double four = 4.;
2087 static double epmach = 2.22e-16;
2094 static double t, u, v;
2096 static double tp, beta, gamma, alpha,
delta;
2129 if (*
sigma == zero) {
2134 if (*
sigma > zero) {
2139 for (i__ = 1; i__ <= i__1; ++i__) {
2143 for (i__ = 1; i__ <= i__1; ++i__) {
2147 for (j = i__ + 1; j <= i__2; ++j) {
2156 t = epmach / *
sigma;
2158 for (i__ = 1; i__ <= i__1; ++i__) {
2169 for (i__ = 1; i__ <= i__1; ++i__) {
2172 if (*
sigma < zero) {
2175 if (*
sigma > zero) {
2179 a[ij] = alpha * a[ij];
2188 for (j = i__ + 1; j <= i__2; ++j) {
2190 z__[j] -= v * a[ij];
2192 a[ij] += beta * z__[j];
2198 for (j = i__ + 1; j <= i__2; ++j) {
2201 a[ij] = gamma * u + beta * z__[j];
2215double linmin_(
int *mode,
const double *ax,
const double *bx,
const double *f,
const double *tol) {
2218 static double c__ = .381966011;
2219 static double eps = 1.5e-8;
2220 static double zero = 0.;
2223 double ret_val, d__1;
2226 static double a, b, d__, e,
m, p, q, r__, u, v, w,
x, fu, fv, fw, fx, tol1, tol2;
2270 v = a + c__ * (b - a);
2283 tol1 = eps * std::abs(
x) + *tol;
2286 if ((d__1 =
x -
m, std::abs(d__1)) <= tol2 - (b - a) * .5) {
2292 if (std::abs(e) <= tol1) {
2296 r__ = (
x - w) * (fx - fv);
2297 q = (
x - v) * (fx - fw);
2298 p = (
x - v) * q - (
x - w) * r__;
2311 if (std::abs(p) >= (d__1 = q * r__, std::abs(d__1)) * .5 || p <= q * (a -
x) || p >= q * (b -
x)) {
2319 d__ = d_sign(&tol1, &d__1);
2323 d__ = d_sign(&tol1, &d__1);
2337 if (std::abs(d__) < tol1) {
2338 d__ = d_sign(&tol1, &d__);
2370 if (fu <= fw || w ==
x) {
2373 if (fu <= fv || v ==
x || v == w) {
2398int daxpy_sl__(
const int *
n,
const double *da,
double const *dx,
const int *incx,
double *dy,
int const *incy) {
2403 static int i__,
m, ix, iy, mp1;
2419 if (*incx == 1 && *incy == 1) {
2427 ix = (-(*n) + 1) * *incx + 1;
2430 iy = (-(*n) + 1) * *incy + 1;
2433 for (i__ = 1; i__ <= i__1; ++i__) {
2434 dy[iy] += *da * dx[ix];
2448 for (i__ = 1; i__ <= i__1; ++i__) {
2449 dy[i__] += *da * dx[i__];
2458 for (i__ = mp1; i__ <= i__1; i__ += 4) {
2459 dy[i__] += *da * dx[i__];
2460 dy[i__ + 1] += *da * dx[i__ + 1];
2461 dy[i__ + 2] += *da * dx[i__ + 2];
2462 dy[i__ + 3] += *da * dx[i__ + 3];
2468int dcopy___(
const int *
n,
double const *dx,
const int *incx,
double *dy,
int const *incy) {
2473 static int i__,
m, ix, iy, mp1;
2486 if (*incx == 1 && *incy == 1) {
2494 ix = (-(*n) + 1) * *incx + 1;
2497 iy = (-(*n) + 1) * *incy + 1;
2500 for (i__ = 1; i__ <= i__1; ++i__) {
2515 for (i__ = 1; i__ <= i__1; ++i__) {
2525 for (i__ = mp1; i__ <= i__1; i__ += 7) {
2527 dy[i__ + 1] = dx[i__ + 1];
2528 dy[i__ + 2] = dx[i__ + 2];
2529 dy[i__ + 3] = dx[i__ + 3];
2530 dy[i__ + 4] = dx[i__ + 4];
2531 dy[i__ + 5] = dx[i__ + 5];
2532 dy[i__ + 6] = dx[i__ + 6];
2538double ddot_sl__(
const int *
n,
double const *dx,
const int *incx,
double const *dy,
int const *incy) {
2544 static int i__,
m, ix, iy, mp1;
2545 static double dtemp;
2560 if (*incx == 1 && *incy == 1) {
2568 ix = (-(*n) + 1) * *incx + 1;
2571 iy = (-(*n) + 1) * *incy + 1;
2574 for (i__ = 1; i__ <= i__1; ++i__) {
2575 dtemp += dx[ix] * dy[iy];
2590 for (i__ = 1; i__ <= i__1; ++i__) {
2591 dtemp += dx[i__] * dy[i__];
2600 for (i__ = mp1; i__ <= i__1; i__ += 5) {
2601 dtemp = dtemp + dx[i__] * dy[i__] + dx[i__ + 1] * dy[i__ + 1] + dx[i__ + 2] * dy[i__ + 2] +
2602 dx[i__ + 3] * dy[i__ + 3] + dx[i__ + 4] * dy[i__ + 4];
2610double dnrm2___(
const int *
n,
double const *dx,
int const *incx) {
2613 static double zero = 0.;
2614 static double one = 1.;
2615 static double cutlo = 8.232e-11;
2616 static double cuthi = 1.304e19;
2627 double ret_val, d__1;
2630 static int i__, j, nn;
2631 static double sum, xmax;
2633 static double hitest;
2698 if ((d__1 = dx[i__], std::abs(d__1)) > cutlo) {
2706 if (dx[i__] == zero) {
2709 if ((d__1 = dx[i__], std::abs(d__1)) > cutlo) {
2721 sum = sum / dx[i__] / dx[i__];
2723 xmax = (d__1 = dx[i__], std::abs(d__1));
2728 if ((d__1 = dx[i__], std::abs(d__1)) > cutlo) {
2734 if ((d__1 = dx[i__], std::abs(d__1)) <= xmax) {
2738 d__1 = xmax / dx[i__];
2739 sum = one + sum * (d__1 * d__1);
2740 xmax = (d__1 = dx[i__], std::abs(d__1));
2744 d__1 = dx[i__] / xmax;
2749 sum = sum * xmax * xmax;
2753 hitest = cuthi /
static_cast<float>(*n);
2757 for (j = i__; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) {
2758 if ((d__1 = dx[j], std::abs(d__1)) >= hitest) {
2766 ret_val = sqrt(sum);
2775 ret_val = xmax * sqrt(sum);
2780int dsrot_(
const int *
n,
double *dx,
const int *incx,
double *dy,
const int *incy,
const double *c__,
const double *s) {
2785 static int i__, ix, iy;
2786 static double dtemp;
2798 if (*incx == 1 && *incy == 1) {
2806 ix = (-(*n) + 1) * *incx + 1;
2809 iy = (-(*n) + 1) * *incy + 1;
2812 for (i__ = 1; i__ <= i__1; ++i__) {
2813 dtemp = *c__ * dx[ix] + *s * dy[iy];
2814 dy[iy] = *c__ * dy[iy] - *s * dx[ix];
2824 for (i__ = 1; i__ <= i__1; ++i__) {
2825 dtemp = *c__ * dx[i__] + *s * dy[i__];
2826 dy[i__] = *c__ * dy[i__] - *s * dx[i__];
2833int dsrotg_(
double *da,
double *db,
double *c__,
double *s) {
2836 static double one = 1.;
2837 static double zero = 0.;
2843 static double r__, z__, roe, scale;
2849 if (std::abs(*da) > std::abs(*db)) {
2852 scale = std::abs(*da) + std::abs(*db);
2853 if (scale != zero) {
2865 r__ = scale * sqrt(d__1 * d__1 + d__2 * d__2);
2866 r__ = d_sign(&one, &roe) * r__;
2871 if (std::abs(*c__) > zero && std::abs(*c__) <= *s) {
2879int dscal_sl__(
const int *
n,
const double *da,
double *dx,
const int *incx) {
2884 static int i__,
m, mp1, nincx;
2903 for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) {
2904 dx[i__] = *da * dx[i__];
2916 for (i__ = 1; i__ <= i__2; ++i__) {
2917 dx[i__] = *da * dx[i__];
2926 for (i__ = mp1; i__ <= i__2; i__ += 5) {
2927 dx[i__] = *da * dx[i__];
2928 dx[i__ + 1] = *da * dx[i__ + 1];
2929 dx[i__ + 2] = *da * dx[i__ + 2];
2930 dx[i__ + 3] = *da * dx[i__ + 3];
2931 dx[i__ + 4] = *da * dx[i__ + 4];
static std::unique_ptr< QThreadPool > tp
double value
The value of the point.
std::map< DeltaEMode::Type, std::string > index
void initializeConstraints(const DblMatrix &equality, const DblMatrix &inequality)
Create constraint array.
size_t numInequalityConstraints() const
size_t numParameters() const
size_t numEqualityConstraints() const
std::vector< double > minimize(const std::vector< double > &x0) const
Perform the minimization.
const size_t m_nparams
Number of parameters under minimization.
void evaluateConstraints(std::vector< double > &constrValues, const std::vector< double > &x) const
Compute values of constraints.
void fprime(std::vector< double > &grad, const std::vector< double > &x) const
Compute derivative numerically.
double fvalue(const std::vector< double > &x) const
Compute the value of the objective function.
std::vector< double > m_constraintNorms
Holder for constraint normals.
size_t numRows() const
Return the number of rows in the matrix.
size_t numCols() const
Return the number of columns in the matrix.