ConvexObjectivePtr CostFromErrFunc::convex(const vector<double>& xin, Model* model) { VectorXd x = getVec(xin, vars_); MatrixXd jac = (dfdx_) ? dfdx_->call(x) : calcForwardNumJac(*f_, x, epsilon_); ConvexObjectivePtr out(new ConvexObjective(model)); VectorXd y = f_->call(x); for (int i=0; i < jac.rows(); ++i) { AffExpr aff = affFromValGrad(y[i], x, jac.row(i), vars_); if (coeffs_.size()>0) { exprScale(aff, coeffs_[i]); if (coeffs_[i] == 0) continue; } switch (pen_type_) { case SQUARED: out->addQuadExpr(exprSquare(aff)); break; case ABS: out->addAbs(aff, 1); break; case HINGE: out->addHinge(aff, 1); break; default: assert(0 && "unreachable"); } } return out; }
ConvexConstraintsPtr ConstraintFromFunc::convex(const vector<double>& xin, Model* model) { VectorXd x = getVec(xin, vars_); MatrixXd jac = (dfdx_) ? dfdx_->call(x) : calcForwardNumJac(*f_, x, epsilon_); ConvexConstraintsPtr out(new ConvexConstraints(model)); VectorXd y = f_->call(x); for (int i=0; i < jac.rows(); ++i) { AffExpr aff = affFromValGrad(y[i], x, jac.row(i), vars_); if (coeffs_.size()>0) { if (coeffs_[i] == 0) continue; exprScale(aff, coeffs_[i]); } if (type() == INEQ) out->addIneqCnt(aff); else out->addEqCnt(aff); } return out; }
ConvexConstraintsPtr ConstraintFromNumDiff::convex(const vector<double>& xin, Model* model) { VectorXd x = getVec(xin, vars_); MatrixXd jac = calcForwardNumJac(*f_, x, epsilon_); ConvexConstraintsPtr out(new ConvexConstraints(model)); VectorXd y = f_->call(x); for (int i=0; i < jac.rows(); ++i) { if (enabled_.empty() || enabled_[i]) { AffExpr aff; aff.constant = y[i] - jac.row(i).dot(x); aff.coeffs = toDblVec(jac.row(i)); aff.vars = vars_; aff = cleanupAff(aff); if (type() == INEQ) out->addIneqCnt(aff); else out->addEqCnt(aff); } } return out; }
ConvexObjectivePtr CostFromNumDiffErr::convex(const vector<double>& xin, Model* model) { VectorXd x = getVec(xin, vars_); MatrixXd jac = calcForwardNumJac(*f_, x, epsilon_); ConvexObjectivePtr out(new ConvexObjective(model)); VectorXd y = f_->call(x); for (int i=0; i < jac.rows(); ++i) { if (coeffs_[i] > 0) { AffExpr aff; aff.constant = y[i] - jac.row(i).dot(x); aff.coeffs = toDblVec(jac.row(i)); aff.vars = vars_; aff = cleanupAff(aff); if (pen_type_ == SQUARED) { out->addQuadExpr(exprMult(exprSquare(aff), coeffs_[i])); } else { out->addAbs(aff, coeffs_[i]); } } } return out; }