Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
0
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;
}