nlopt_result NLOPT_STDCALL nlopt_add_equality_constraint(nlopt_opt opt, nlopt_func fc, void *fc_data, double tol) { nlopt_result ret; if (!opt || !equality_ok(opt->algorithm) || nlopt_count_constraints(opt->p, opt->h) + 1 > opt->n) ret = NLOPT_INVALID_ARGS; else ret = add_constraint(&opt->p, &opt->p_alloc, &opt->h, 1, fc, NULL, fc_data, &tol); if (ret < 0 && opt && opt->munge_on_destroy) opt->munge_on_destroy(fc_data); return ret; }
nlopt_result NLOPT_STDCALL nlopt_add_equality_mconstraint(nlopt_opt opt, unsigned m, nlopt_mfunc fc, void *fc_data, const double *tol) { nlopt_result ret; if (!m) { /* empty constraints are always ok */ if (opt && opt->munge_on_destroy) opt->munge_on_destroy(fc_data); return NLOPT_SUCCESS; } if (!opt || !equality_ok(opt->algorithm) || nlopt_count_constraints(opt->p, opt->h) + m > opt->n) ret = NLOPT_INVALID_ARGS; else ret = add_constraint(&opt->p, &opt->p_alloc, &opt->h, m, NULL, fc, NULL, fc_data, tol); if (ret < 0 && opt && opt->munge_on_destroy) opt->munge_on_destroy(fc_data); return ret; }