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
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
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