Source code for openmdao.components.constraint

""" ConstraintComp is now deprecated."""

import warnings

from openmdao.components.exec_comp import ExecComp


[docs]class ConstraintComp(ExecComp): """ ConstraintComp is deprecated. Please see the basic tutorial for more information. A Component that represents an equality or inequality constraint. Args ---- expr : str Constraint expression containing an operator that is one of ['<', '>', '<=', '>=', '=']. out : str, optional Name of the output variable containing the result of the constraint equation. Default is 'out'. Options ------- deriv_options['type'] : str('user') Derivative calculation type ('user', 'fd', 'cs') Default is 'user', where derivative is calculated from user-supplied derivatives. Set to 'fd' to finite difference this system. Set to 'cs' to perform the complex step if your components support it. deriv_options['form'] : str('forward') Finite difference mode. (forward, backward, central) deriv_options['step_size'] : float(1e-06) Default finite difference stepsize deriv_options['step_calc'] : str('absolute') Set to absolute, relative deriv_options['check_type'] : str('fd') Type of derivative check for check_partial_derivatives. Set to 'fd' to finite difference this system. Set to 'cs' to perform the complex step method if your components support it. deriv_options['check_form'] : str('forward') Finite difference mode: ("forward", "backward", "central") During check_partial_derivatives, the difference form that is used for the check. deriv_options['check_step_calc'] : str('absolute',) Set to 'absolute' or 'relative'. Default finite difference step calculation for the finite difference check in check_partial_derivatives. deriv_options['check_step_size'] : float(1e-06) Default finite difference stepsize for the finite difference check in check_partial_derivatives" deriv_options['linearize'] : bool(False) Set to True if you want linearize to be called even though you are using FD. """ def __init__(self, expr, out='out'): warnings.simplefilter('always', DeprecationWarning) warnings.warn("ConstraintComp is deprecated, see the new add_constraint interface.", DeprecationWarning,stacklevel=2) warnings.simplefilter('ignore', DeprecationWarning) newexpr = _combined_expr(expr) super(ConstraintComp, self).__init__("%s = %s" % (out, newexpr))
def _combined_expr(expr): """Given a constraint object, take the lhs, operator, and rhs and combine them into a single expression by moving rhs terms over to the lhs. For example, for the constraint 'C1.x < C2.y + 7', return the expression 'C1.x - C2.y - 7'. Depending on the direction of the operator, the sign of the expression may be flipped. The final form of the constraint, when evaluated, will be considered to be satisfied if it evaluates to a value <= 0. """ lhs, op, rhs = _parse_constraint(expr) first, second = (rhs, lhs) if op.startswith('>') else (lhs, rhs) try: if float(first) == 0: return "-(%s)" % second except Exception: pass try: if float(second) == 0.: return first except Exception: pass return '%s-(%s)' % (first, second) def _parse_constraint(expr_string): """ Parses the constraint expression string and returns the lhs string, the rhs string, and comparator """ for comparator in ['==', '>=', '<=', '>', '<', '=']: parts = expr_string.split(comparator) if len(parts) == 2: # check for == because otherwise they get a cryptic error msg if comparator == '==': break return (parts[0].strip(), comparator, parts[1].strip()) # elif len(parts) == 3: # return (parts[1].strip(), comparator, # (parts[0].strip(), parts[2].strip())) msg = "Constraints require an explicit comparator (=, <, >, <=, or >=)" raise ValueError(msg)