Пример #1
0
    def _quadratic_constraint(
        self, constraint: QuadraticConstraint
    ) -> Tuple[Dict[str, float], Dict[Tuple[str, str], float], str, float]:
        left_expr = constraint.get_left_expr()
        right_expr = constraint.get_right_expr()
        if not isinstance(left_expr, (Expr, Var)):
            raise QiskitOptimizationError(
                f"Unsupported expression: {left_expr} {type(left_expr)}")
        if not isinstance(right_expr, (Expr, Var)):
            raise QiskitOptimizationError(
                f"Unsupported expression: {right_expr} {type(right_expr)}")
        if constraint.sense not in self._sense_dict:
            raise QiskitOptimizationError(
                f"Unsupported constraint sense: {constraint}")

        if isinstance(left_expr, Var):
            left_expr = left_expr + 0  # Var + 0 -> LinearExpr
        if left_expr.is_quad_expr():
            left_lin, left_quad = self._quadratic_expr(left_expr)
        else:
            left_lin = self._linear_expr(left_expr)
            left_quad = {}

        if isinstance(right_expr, Var):
            right_expr = right_expr + 0
        if right_expr.is_quad_expr():
            right_lin, right_quad = self._quadratic_expr(right_expr)
        else:
            right_lin = self._linear_expr(right_expr)
            right_quad = {}

        linear = self._subtract(left_lin, right_lin)
        quadratic = self._subtract(left_quad, right_quad)
        rhs = right_expr.constant - left_expr.constant
        return linear, quadratic, self._sense_dict[constraint.sense], rhs
Пример #2
0
    def _quadratic_constraint(
        cls, var_names: Dict[Var, str], constraint: QuadraticConstraint
    ) -> Tuple[Dict[str, float], Dict[Tuple[str, str], float], str, float]:
        left_expr = constraint.get_left_expr()
        right_expr = constraint.get_right_expr()
        if not isinstance(left_expr, (QuadExpr, AbstractLinearExpr, Var)):
            raise QiskitOptimizationError(
                f"Unsupported expression: {left_expr} {type(left_expr)}")
        if not isinstance(right_expr, (QuadExpr, AbstractLinearExpr, Var)):
            raise QiskitOptimizationError(
                f"Unsupported expression: {right_expr} {type(right_expr)}")

        lin = {}
        quad = {}

        if left_expr.is_quad_expr():
            for x in left_expr.linear_part.iter_variables():
                lin[var_names[x]] = left_expr.linear_part.get_coef(x)
            for quad_triplet in left_expr.iter_quad_triplets():
                i = var_names[quad_triplet[0]]
                j = var_names[quad_triplet[1]]
                v = quad_triplet[2]
                quad[i, j] = v
        else:
            for x in left_expr.iter_variables():
                lin[var_names[x]] = left_expr.get_coef(x)

        if right_expr.is_quad_expr():
            for x in right_expr.linear_part.iter_variables():
                lin[var_names[x]] = lin.get(
                    var_names[x], 0.0) - right_expr.linear_part.get_coef(x)
            for quad_triplet in right_expr.iter_quad_triplets():
                i = var_names[quad_triplet[0]]
                j = var_names[quad_triplet[1]]
                v = quad_triplet[2]
                quad[i, j] = quad.get((i, j), 0.0) - v
        else:
            for x in right_expr.iter_variables():
                lin[var_names[x]] = lin.get(var_names[x],
                                            0.0) - right_expr.get_coef(x)

        rhs = right_expr.constant - left_expr.constant

        if constraint.sense not in cls._sense_dict:
            raise QiskitOptimizationError(
                f"Unsupported constraint sense: {constraint}")

        return lin, quad, cls._sense_dict[constraint.sense], rhs
Пример #3
0
 def _new_qconstraint(self, lhs, ct_sense, rhs, name=None):
     # noinspection PyPep8
     left_expr = self._to_expr(lhs, context="QuadraticConstraint.left_expr")
     right_expr = self._to_expr(rhs, context="QuadraticConstraint.right_expr")
     self._model._checker.typecheck_two_in_model(self._model, left_expr, right_expr, "new_binary_constraint")
     ct = QuadraticConstraint(self._model, left_expr, ct_sense, right_expr, name)
     left_expr.notify_used(ct)
     right_expr.notify_used(ct)
     return ct